2010-12-09 8 views

Répondre

1

Vous pouvez écrire des requêtes LINQ qui utilisent des méthodes d'instance sur System.String. La plupart des fournisseurs LINQ sont capables de convertir cela en instructions SQL. Par exemple:

from customer in db.Customers 
where customer.Name.Contains("foo") || customer.Name.Contains("bar") 
select customer; 

LINQ to Entities se convertir en quelque chose comme ceci:

SELECT T1.* 
FROM Customers T1 
WHERE T1.Name LIKE '%' + @p1 + '%' 
OR T1.Name LIKE '%' + @p2 + '%' 

Notez que lorsque vous avez besoin d'un nombre dynamique de mots à rechercher, vous pouvez utiliser le PredicateBuilder. Il vous permet de créer des prédicats contenant des instructions OR. La réécriture avec des syndicats est également une méthode efficace. Par exemple:

string[] searchWords; 

// Define an empty set. 
var customers = 
    from customer in db.Customers 
    where false 
    select customer; 

// Union the empty set with a set for a word. 
foreach (var temp in searchWords) 
{ 
    var searchWord = temp; 

    customers = customers.Union(
     from customer in db.Customer 
     where customer.Name.Contains(searchWord) 
     select customer); 
} 
+0

Cela ne fonctionne pas si vous avez 2 mots –

+1

Cela peut fonctionner avec plusieurs mots, mais lorsque vous avez besoin d'un nombre dynamique de mots, vous devez écrire la requête LINQ différemment (avec des unions par exemple) ou utiliser PredicateBuilder: http: //www.albahari.com/nutshell/predicatebuilder.aspx. – Steven

+0

Le problème avec cette réponse est que je ne sais pas combien de mots-clés arrivent. Donc, si j'ai 3 mots-clés, cela manquera un. –

1

Je crois que vous êtes après quelque chose comme:

from xx in table 
where uids.Contains(xx.uid.ToString()) 
select xx 

?

Si vous êtes après une recherche séparée de chaîne, peut-être:

string input = "some String"; 
string[] toSearchFor = GetSearchStrings(); 
var containsAll = toSearchFor.All(x => input.Contains(x)); 
+0

+1 - me battre pour elle re .Toutes() ... Cela dit, je pense que cette solution générale (essayer d'imiter la recherche FreeText) sera une véritable ressource et de porc de performance pour la OP. –

+0

Je ne pense pas que LINQ to Entities est capable de gérer l'opérateur 'All'. – Steven