2009-09-01 7 views
8

Rozszerzyłem moje jednostki, aby zaimplementować określone interfejsy dla swojego typu. Próbuję wykonać następujące zapytanie:Prześlij wyniki linq do listy <MyInterface>

var results = from x in context.MyEntityTable 
       where x.AProperty == AValue 
       select x; 

return results.Count() > 0 ? results.Cast<IApplicationEntity>().ToList() : null; 

jednak wciąż otrzymuję następujący błąd:

„LINQ do podmiotów obsługuje tylko odlewy Modele Podmiot danych prymitywne typy”

Zasadniczo co Chcę to zawsze konwertować wyniki z surowego typu obiektu na ogólną listę implementowanego interfejsu.

Czy to możliwe?

Odpowiedz

20

Można zrobić obsadę na kliencie, z pominięciem Entity Framework warstwę tłumaczenie zapytań poprzez wywołanie metody AsEnumerable rozszerzenie:

return results.Any() 
     ? results.AsEnumerable().Cast<IApplicationEntity>().ToList() 
     : null; 

jednak, że lepiej, aby odwrócić kolejność robi czek Count:

var list = results.AsEnumerable().Cast<IApplicationEntity>().ToList(); 
return list.Count == 0 ? null : list; 
+1

+1, jednak spowoduje to wykonanie dwóch zapytań DB (dla Count i ForList) ... prawdopodobnie lepiej będzie wcześniej wywołać ToList, a następnie sprawdzić liczbę pozycji –

+0

@Thomas: Spójrz na drugie zapytanie. –

+0

Tak, to lepiej;) –

0
return results.Count() > 0 ? 
results.Select(result => (IApplicationEntity)result) 
.ToList() : null; 
+0

Nie sądzę, że to zadziała, z tego samego powodu, z którego metoda Cast nie działa. Konwertuj zapytanie na IEnumerable first –

+0

Komunikat stwierdza, że ​​nie wie, jak przekształcić operator Cast() w linq na encje. To jest faktycznie kod napisany przez dostawcę dostawcy linq (np. Linq do Sql, linq do Objects itp.) Inne plakaty proponowały zmianę wywołania na AsEnumerable, aby wymusić użycie Linqa do Objects, a tym samym Operacja Cast() zakończy się pomyślnie. Robiłem to samo, ale używając C# zamiast przez jawne rzutowanie rzutowania na kod. Spróbuj i daj mi znać, czy zadziałało. – Spence

3

Jeśli chcesz rzucić wyniki na złożony typ, musisz wymusić na kodzie użycie LINQ do obiektów zamiast LINQ do Entiti es.

Wywołanie metody rozszerzenia przed rzutowaniem jest tutaj możliwe.

Spróbuj wykonać następujące czynności:

var results = from x in context.MyEntityTable 
       where x.AProperty == AValue 
       select x; 

return results.AsEnumerable().Cast<IApplicationEntity>().ToList(); 

Należy również pamiętać, że to nie jest mądre, aby sprawdzić Count() na przeliczalny, ponieważ oznacza to, że kolekcja jest ponad dwa razy powtórzyć.

+0

W rzeczywistości to nie zadziała. Powinieneś zrobić 'AsEnumerable' * przed * obsadą. W przeciwnym razie EF spróbuje przetłumaczyć je na zapytanie, które będzie uruchamiane u dostawcy. –

+0

@Mehrdad: Zbyt szybki dla twojego własnego dobra. Edytowałem post tuż przed Twoim komentarzem. ;) – Noldorin

Powiązane problemy