2012-04-05 14 views
7

Ich habe eine LINQ-Abfrage. Ich habe eine Reihe von Parametern aus einem Formular, das ich sammle, wo ich nach Feldern filtern muss, nach denen der Benutzer sucht.Linq optionale Parameter

Ich habe ein paar mehr nicht-String-Feld-Filter, die ich einschließlich lange und boolean filtern muss. Sie könnten Nullen sein, wenn der Benutzer nichts auswählt. Wie kann ich sie in die Abfrage aufnehmen?

+0

Diese Liste ist unbekannt? Wie eine Art Abfrage-Generator? – Jodrell

+0

Also hat die 'model' Klasse einige willkürliche Eigenschaften, die mit den Attributen der' User' Entität übereinstimmen können, oder ist die Beziehung stärker? – Jodrell

Antwort

16

Dies ist eines der besten Beispiele dafür, warum LINQ so leistungsfähig ist - verzögerte Ausführung. Sie können die Abfrage in verschiedenen Phasen aufbauen, und nur, wenn die Abfrage schließlich ausgeführt wird, oder die SQL-Anweisung erzeugt gelöst werden:

var query = edmxObject.Users.AsQueryable<Users>(); 

if (! String.IsNullOrEmpty(model.FirstName)) { 
    query = from user in query 
      where user.FirstName.Contains(model.FirstName) 
      select user; 
} 
if (! String.IsNullOrEmpty(model.UserName) { 
    query = from user in query 
      where user.UserName.Contains(model.UserName) 
      select user; 
} 

// this will cause the query to execute get the materialized results 
var result = query.ToList(); 
+3

Es hängt vom DataContext ab, aber Sie müssen 'query' möglicherweise als' IQueryable <> 'definieren, anstatt' var' zu verwenden. Einige Provider haben es als eine Klasse, die 'IQueryable <>' implementiert. Sie können auch ein 'AsQueryable()' nach 'Users' anheften. – Servy

+1

können Sie auch 'query = query.Where (u => u.FirstName.Contains (model.FirstName));' in Ihrer if-Anweisung verwenden. Hängt von Ihrer bevorzugten Syntax ab. –

+0

@Servy Ich habe für das aktualisiert. Netter Fang, danke! – Yuck

5

Wenn die Abfrage nicht ein bestimmtes Feld enthält, die Sie nicht brauchen enthalten sie als Teil der Where-Klausel überhaupt:

IQueyable<Users> user = from user in edmxObject.Users; 

if (model.FirstName != null) 
    users = users.Where(user => user.FirstName.Contains(model.FirstName) 

if (/* age is searched for */) 
    users = users.Where(user => user.Age == model.Age); 

können Sie bedingt brauchen Nest auf diese Weise Prädikate Sie Sie wirklich nur die Bedingungen zu gewährleisten.

+0

danke das hat geholfen. – desiguy