2013-09-04 7 views
5

Quindi so che iQueryables sono tradotti in istruzioni SQL e quindi non possono gestire tutti i possibili metodi che è possibile inserire in una clausola where.IQueryable per entità. Dove (la proprietà è nell'array locale)

Ma questo è quello che sto cercando di fare:

int[] alreadySelectedIds = ... 
var subjects = Entities.NewInstance.Subjects.Where(x => Array.IndexOf(alreadySelectedIds, x.Id) == -1).ToList(); 

e post lettura come questi qui di seguito, sto confortato che EF5 dovrebbe essere in grado di tradurre questo.
Getting Entities whose keys match list(or array) of ids

Tuttavia, sto ottenendo questo errore:

LINQ to Entities does not recognize the method 'Int32 IndexOf[Int32](Int32[], Int32)' method, and this method cannot be translated into a store expression.

E googling questo errore non mi dà molto aiuto.

Ho anche provato

var newSubjects = Entities.NewInstance.Subjects.Where(x => alreadySelectedIds.Contains(x.Id)).ToList(); 

Unable to create a null constant value of type 'System.Int32[]'. Only entity types, enumeration types or primitive types are supported in this context.

e

List<int> alreadySelectedIds = ... 

Unable to create a null constant value of type 'System.Collections.Generic.List`1'. Only entity types, enumeration types or primitive types are supported in this context.

Sono bloccato e il mio cervello sta ottenendo pastoso al di là della possibilità di qualsiasi tipo di recupero grazioso. Qualcuno può gentilmente salvarmi?

risposta

4
Entities.NewInstance.Subjects.Where(x => alreadySelectedIds.Contains(x.Id)).ToList(); 

dovrebbe funzionare, se alreadySelectedIs non è nullo

si può fare una verifica nulla all'interno o prima della query:

Entities.NewInstance.Subjects.Where(x => alreadySelectedIds == null 
             ? true // or false 
             : alreadySelectedIds.Contains(x.Id) 
            ).ToList(); 

(che può essere riscritta, a seconda se si desidera che tutti o nulla se alreadySelectedIds è nullo)

//return all if null 
x => alreadySelectedIds == null || alreadySelectedIds.Contains(x.Id) 

o

//return nothing if null 
x => alreadySelectedIds != null && alrreadySelectedIds.Contains(x.Id) 
+2

È piuttosto fantastico come un uomo possa lottare invano con un semplice problema, solo perché il sentiero per la corretta comprensione del problema è perso tra disperazione e panico intellettuale. Ma cosa può fare un uomo, ma essere un uomo? – Alex

+0

@Alex troppa filosofia per l'informatica;) Ma ... anzi! –

Problemi correlati