Fa LINQ Supporto Componibile “o query”?
-
21-08-2019 - |
Domanda
In un altro post : Fa Linq to SQL supporta le query componibili si è discusso su come comporre / concat in cui le clausole in modo dinamico. Questo sembra essere fatto con un "AND" (cioè la prima dove clausola e la seconda clausola where sono uniti da un AND). Quello che mi chiedo è se c'è un modo di comporre query LINQ con un OR.
Esempio:
var people = from p in Person
where p.age < 18
select p
var otherPeople = from p in people
where p.firstName equals "Daniel"
select p
Questo dà alle persone con un nome di "Daniel" e che sono sotto i 18 anni che sto cercando la sintassi per unire questi per trovare persone che hanno un nome di "Daniel" o che sono sotto i 18 anni.
Nota:. Sto usando ADO.NET Data Services in modo da non ho .Contains () a mia disposizione
Modifica : L'Unione Suggerimento (da Garry Shutler) è esattamente quello che sto cercando per la funzionalità-saggio. Ho incontrato due possibili problemi con esso:
- Sembra che renderebbe colpi multipli di database se dovessi fare una terza condizione (unione sembra prendere un IEnumerable come parametro) - Speravo di costruire multiple AND e OR nel codice e quindi eseguire una richiesta .
- Unione non è supportato da ADO.NET Data Services (molto deludente)
Soluzione
è ciò che si vuole il più semplice:
var people = from p in Person
where p.age < 18 || p.firstName == "Daniel"
select p;
o hai appena dato un semplice esempio?
In questo caso è possibile utilizzare:
var under18 = from p in Person
where p.age < 18
select p;
var daniels = from p in Person
where p.firstName == "Daniel"
select p;
var combined = under18.Union(daniels);
LinqToSql può essere abbastanza intelligente da convertire in un OR ma non ne sono così sicuro.
Altri suggerimenti
Cosa succede ad usare PredicateBuilder da Joe Albahari?
var predicate = PredicateBuilder.False<Person>();
predicate = predicate.Or(p => p.age < 18);
predicate = predicate.Or(p => p.firstName == "Daniel");
var query = Person.Where(predicate);
L'opzione predicato è la strada da percorrere. L'opzione Unione non costruisce buona sql. Riferimento http: // social.msdn.microsoft.com/forums/en-US/linqprojectgeneral/thread/925b245d-5529-4a64-8cd4-4bc83ee6fe7a/
ho scritto su come raggiungere domande che cercano un valore chiave all'interno di un set sul mio blog. Ecco i link pertinenti.
contiene le operazioni in ADO.NET Data Services Parte I
contiene le operazioni in ADO.NET Data Services Parte II
Con questo, è possibile scrivere query che assomigliano a questo
//The set in which we have to search for a match
List<string> citiesIWillVisit = new List<string>() {"London","Berlin","Prague"};
var customersAround = nwContext.Customers
.IsIn<Customers>(citiesIWillVisit, c=> c.City);
foreach (Customers localCustomer in customersAround) {
System.Console.WriteLine(localCustomer.ContactName);
}