2009-10-08 5 views
4

J'ai une chaîne avec des noms séparés semi-virgules:Usinq Linq permet de sélectionner des éléments dans une chaîne séparée par une virgule.

string names = "Jane;Harry"; 

J'ai aussi une liste d'objets de clients:

public class Customer 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

List<Customer> customers = new List<Customer>(); 
customers.Add(new Customer(){FirstName="John", LastName="Doe"}); 
customers.Add(new Customer(){FirstName="Jane", LastName="Doe"}); 
customers.Add(new Customer(){FirstName="Harry", LastName="Potter"}); 

var query = from c in customers 
      select c; 

Comment puis-je créer une requête qui ne renvoie que les clients qui a un prénom qui est dans la liste séparée par des virgules?

Quelque chose comme le SELECT FistName FROM customer WHERE FirstName IN (list) T-SQL (sorte de)

Répondre

10

Eh bien, vous devriez vraiment diviser la chaîne jusqu'à commencer - sinon vous aurez un match pour « Jane », même si la liste est " Janet, Harry ".

Vous pourriez faire:

string[] validNames = names.Split(';'); 
var query = customers.Where(c => validNames.Contains(c.FirstName)); 

Une autre option est d'utiliser un HashSet, qui se produira beaucoup mieux lorsque la liste est très grande:

HashSet<string> validNames = new HashSet<string>(names.Split(';')); 
var query = customers.Where(c => validNames.Contains(c.FirstName)); 

Je l'ai utilisé la notation point ici au lieu d'une expression de requête, car c'est plus simple lorsque vous appliquez simplement une clause ou deux. En tant qu'expression de requête, cependant, ce serait:

var query = from c in customers 
      where validNames.Contains(c.FirstName) 
      select c; 
1
List<string> firstnames = names.Split(';').ToList(); 

      var query = from c in customers 
         where firstnames.Contains(c.FirstName) 
         select c ; 
Questions connexes