2010-03-16 6 views
30

Le fichier d'aide fourni avec Dynamic Linq dans CSharpSamples.zip ne montre aucun exemple d'utilisation de contains ou de like.Comment utiliser "contains" ou "like" dans une requête linq dynamique?

Existe-t-il des solutions de contournement simples pour cela? c'est-à-dire où (col comme @col) ne fonctionne pas.

+0

Veuillez prendre note de toutes les personnes dont je parle de la LINQ DYNAMIC fournie avec Visual Studio dans le fichier d'exemples. Dans cette version, je peux définir une requête where en utilisant une chaîne "mycol = @mycol". Je connais les cas simples. –

+0

Ce que j'aimerais * vraiment * faire, c'est insérer la chaîne "Like" à la place du "=" dans ma chaîne et avoir le Linq Dynamique pour l'analyser. Mais, je vais prendre un travail. Je pense que la raison pour laquelle il n'a pas été ajouté est qu'ils ont construit leur analyseur sur System.Linq.Expressions qui n'a pas cette méthode. –

+0

Pour être clair, je peux le faire "UserName = @ 0, Contact.FirstName = @ 1" Mais pas « UserName comme @ 0, Contact.FirstName comme @ 1" Si ce sont des chaînes, et en utilisant la syntaxe LINQ dynamique: dc.table.where (mystring, tableau) –

Répondre

56

Voici la réponse! Dynamic Linq prend en charge le. opérateur,

Selon les docs:

"champ instance ou d'instance propriété d'accès Tout terrain public ou propriété est accessible."

Ainsi, il est possible d'utiliser cette syntaxe

.Where("MyColumn.Contains(@0)", myArray) 

Merci pour toutes les suggestions! Et merci à moi pour trouver la solution.

+1

Comment puis-je faire cela sur une colonne nullable – Thea

+8

@Teddy .Lorsque (? "MaColonne ! = null && MyColumn.Contains (@ 0) ", myArray) –

+0

Comment convertir une Grille' FilterExpression' à cette syntaxe? Il existe des bibliothèques NuGet Dynamic LINQ, y compris le support de .NET 4.0 ... savons-nous s'il y en a – PeterX

1

Veuillez noter que la solution fournie ne fonctionne que pour des cas simples: si vous voulez utiliser des paramètres pour la source de l'appel Contient, et/ou si vous voulez utiliser la collection interrogée actuelle comme paramètre pour les Contient appel, la solution fournie ne fonctionnera pas.

Vous pouvez trouver dans le blog suivant poster une solution pour étendre correctement la bibliothèque dynamique LINQ et ajouter le support pour l'extension Contient:

http://blog.walteralmeida.com/2010/05/advanced-linq-dynamic-linq-library-add-support-for-contains-extension-.html

4

Pour moi, la solution a été outerIt.

class User { public string Name { get; set; } } 
    ... 
    IQueryable<User> query = db.Users; 
    ... 
    query = query.Where("@0.Contains(outerIt.Name)", list); 

Notez que outerIt est en quelque sorte un mot-clé construit dans la bibliothèque (vous n'êtes pas obligé de le modifier comme vous pouvez le lire dans une réponse ici). Vous pouvez accéder à la propriété du type de votre requête à travers elle.