2012-11-22 8 views
13

Ich suche nach dem Lambda-Ausdruck wie die baut unterLambda Ausdruck "IN" Operator existiert?

IQueryable<Object> queryEntity = 
       _db.Projects.Where(Project=>Project.Id.IN(1,2,3,4)); 

Ich habe keinen IN Operator in Lambda Ausdruck finden.

Jeder hat Vorschläge?

+2

See schreiben konnte [ 'IEnumerable.Contains'] (http://msdn.microsoft.com/en-us/library/ bb357185.aspx); dort EF-Einschränkungen, welche Arten von "local sourced" -Sequenzen erlaubt sind. Ganze Zahlen sind in Ordnung. –

Antwort

17

Verwenden Sie hierzu IEnumerable.Contains.

var idList = new[] { 1, 2, 3, 4 }; 
IQueryable<Object> queryEntity = 
       _db.Projects.Where(Project => idList.Contains(Project.Id)); 

Sie konnten die idList inline natürlich konstruieren.

+1

Aber denken Sie daran, wenn es mit sehr großen idList (sagen 8000 IDs) zu DB geht, kann es fehlschlagen. Ich denke, das ist für das Überschreiten der Losgröße oder etw. - zumindest hatte ich den Fall. –

+0

Ja - alle Probleme, die beim Erstellen von seltsamen LINQ-Abfragen auftreten können, die in langsame SQL-Aufrufe übersetzt werden, gelten. Aber das gilt für alles, was Sie wirklich mit IQueryable tun. :) –

+2

Wenn 'idList' wirklich groß ist, dann gibt es eine gute Chance, dass es als ein DB-Abfrageergebnis kam, in diesem Fall sollten Sie stattdessen gegen diese Abfrage ANMELDEN, richtig? –

2

Es gibt keine in-Operator, aber es gibt eine enthält. Nur Ihre Logik invertieren:

IQueryable<Object> queryEntity = _db.Projects.Where(Project=>(new []{1,2,3,4}).Contains(Project.Id));

+0

Syntaxfehler. (1,2,3,4) bedeutet nichts – Tilak

0

Sie Ihre eigenen

public static bool In(this object item, IEnumerable list) 
{ 
    return list.Contains(item); 
} 

public static bool In(this object item, params object[] list) 
{ 
    return item.In(list); 
} 
+0

und wie unterscheidet es sich von http://msdn.microsoft.com/en-us/library/bb352880.aspx – Tilak

+0

es heißt wie OP wollte – slawekwin

+0

Dies ist nicht verwendbar In einem 'IQueryable'-Kontext würde der Server dies verstehen, da es keine Möglichkeit gibt, dies in SQL zu übersetzen. –