2010-05-27 6 views
1

J'ai une liste de mots-clés dans une ArrayList et je voulais être en mesure de créer une requête pour trouver des enregistrements dans une table en fonction de ces mots-clés.LINQ Multiple LIKE basé sur Liste

Étant donné que la liste des mots-clés est dynamique, je ne peux pas générer de requête fixe ici.

je fais quelque chose comme ceci:

foreach (string kw in keywords) 
{ 
    query = query.Where(p => p.Name.StartsWith(kw)); 
} 

Le « StartsWith » est nécessaire ici parce que je dois rechercher les enregistrements qui commencent en fait avec le mot-clé fourni.

Dans T-SQL, il serait quelque chose comme ça

Select * from Table where 
Name like 'keyword1%' 
or Name like 'keyword2%' 
or Name like 'keyword3%' 
or ... 

Mais je dois pouvoir le faire dans LINQ ... Est-ce possible?

Répondre

3

Ce oughtta faire:

var query = table.Where(p => keywords.Any(kw => p.Name.StartsWith(kw))); 
+0

Je me demande si LINQ to SQL est vraiment intelligent. Je sais que EF3.5 échouerait lamentablement avec une telle requête. Toujours mon +1. – Steven

+0

En utilisant ceci, la séquence locale "" ne peut pas être utilisée dans l'implémentation LINQ to SQL à l'exception de l'opérateur Contains(). "Exception ... – Bathan

+0

@Bathan: Je suppose que @ Steven a raison - L2S n'est pas Malheureusement, je ne peux pas vraiment voir un moyen facile de le réécrire en utilisant 'Contains' ... – tzaman

0
var query = table.Where(p => keywords.Any(kw => p.Name.StartsWith(keyword1) || p.Name.StartsWith(keyword2) || p.Name.StartsWith(keyword3) || p.Name.StartsWith(keyword4))); 

L'espoir peut vous aider et avoir une belle journée.