2013-09-04 4 views
5

Wiem więc, że iQueryables są tłumaczone na instrukcje SQL i dlatego nie mogą obsłużyć wszystkich możliwych metod, które można umieścić w klauzuli where.IQueryable dla encji .Where (właściwość jest w tablicy lokalnej)

Ale to, co usiłuję zrobić:

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

i czytanie postu jak te poniżej, jestem pocieszony że EF5 powinien być w stanie przetłumaczyć.
Getting Entities whose keys match list(or array) of ids

Jednak dostaję ten błąd:

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

I googling ten błąd nie daje mi wiele pomóc.

Próbowałem również

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.

i

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.

utknąłem i mój mózg jest coraz bzdurny poza możliwością dowolnego typu płynnego odzysku. Czy ktoś może mnie uratować?

Odpowiedz

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

powinny działać, jeśli alreadySelectedIs nie jest null

można zrobić sprawdzenie pustego wewnątrz lub przed zapytanie:

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

(które mogą być zapisane w zależności czy chcesz całości lub nic jeśli alreadySelectedIds jest null)

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

lub

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

To dość fantastyczne, jak człowiek może na próżno walczyć z prostym problemem, tylko dlatego, że droga do poprawnego zrozumienia problemu jest tracona wśród rozpaczy i intelektualnej paniki. Ale co może zrobić człowiek, ale być mężczyzną? – Alex

+0

@Alex za dużo filozofii dla informatyki;) Ale ... rzeczywiście! –