2012-11-22 21 views
13

Sto cercando di costruire l'espressione lambda come di seguitoEspressione lambda Operatore "IN" Esiste?

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

non trovo alcun IN operatore in un'espressione lambda.

Qualcuno ha suggerimenti?

+2

Sede [ 'IEnumerable.Contains'] (http://msdn.microsoft.com/en-us/library/ bb357185.aspx); Esistono restrizioni EF su quali tipi sono consentiti dalle sequenze "di provenienza locale". Gli interi vanno bene. –

risposta

17

Utilizzare IEnumerable.Contains per questo.

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

Si potrebbe costruire il idList linea naturalmente.

+1

Ma tieni presente che se questo va a DB con idList veramente grande (ad esempio 8000 ID) potrebbe fallire. Penso che questo sia per il superamento delle dimensioni del batch o di sth - almeno lo ero. –

+0

Sì: si applicano tutti i problemi che possono sorgere dalla costruzione di query LINQ strane che vengono tradotte in chiamate SQL lente. Ma ciò vale per qualsiasi cosa tu faccia con IQueryable davvero. :) –

+2

Se 'idList' è veramente grande, allora ci sono buone probabilità che si verifichi come risultato di una query DB, nel qual caso dovresti invece ISCRIVERTI contro quella query, giusto? –

2

Non v'è alcun operatore in, ma c'è un contiene. Basta invertire la logica:

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

+0

errore di sintassi. (1,2,3,4) significa nulla – Tilak

0

si potrebbe scrivere il proprio

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

e in che modo è diverso da http://msdn.microsoft.com/en-us/library/bb352880.aspx – Tilak

+0

viene chiamato come OP desiderato – slawekwin

+0

Questo non è utilizzabile in un contesto 'IQueryable', poiché non c'è modo di tradurre questo in SQL che il server avrebbe capito. –