Ho una stringa con nomi separati da semi-virgola:
string names = "Jane;Harry";
Ho anche un elenco di oggetti del cliente:
public class Customer { public string FirstName { get; set; } public string LastName { get; set; } } List customers = new List(); 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;
Come faccio a creare una query che restituisce solo quei clienti che hanno un nome che è nella lista separata da semi-virgola?
Qualcosa come T-SQL SELECT FistName FROM customer WHERE FirstName IN (list)
(sorta di)
Bene, dovresti dividere la corda per iniziare – altrimenti otterrai una corrispondenza per “Jane” anche se la lista è “Janet; Harry”.
Potresti fare:
string[] validNames = names.Split(';'); var query = customers.Where(c => validNames.Contains(c.FirstName));
Un’altra opzione è usare un HashSet
, che funzionerà molto meglio quando la lista è molto grande:
HashSet validNames = new HashSet (names.Split(';')); var query = customers.Where(c => validNames.Contains(c.FirstName));
Ho usato notazione punto qui invece di un’espressione di query perché è più semplice quando si applica solo una clausola o due. Tuttavia, come espressione di query, sarebbe:
var query = from c in customers where validNames.Contains(c.FirstName) select c;
List firstnames = names.Split(';').ToList(); var query = from c in customers where firstnames.Contains(c.FirstName) select c ;