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:

  1. 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 .
  2. Unione non è supportato da ADO.NET Data Services (molto deludente)
È stato utile?

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);
}

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top