2011-02-10 12 views
10

Mam jednostkę pracy i repozytorium używające EF 4 i POCO. Ponieważ EF wymaga uporządkowanego zestawu, zanim będzie mógł Pomijać() i Take(), dodałem następujący test jednostki (bez makiet), aby wyciągnąć rekord, aby sprawdzić, czy zadziałało.Pomóż mi zrozumieć "LINQ to Entities obsługuje tylko podstawowe typy rzutowania danych jednostki Entity"

var myList = UOW.EntityRepo.Get(orderbyLambda: p => p.ID, page: 1, pageSize: 1); 

Powoduje to wyrażenie orderbyLambda = {p => Convert(p.ID)} i błąd podczas wyliczenia. Identyfikator to tinyint (Int16/krótki)

Dlaczego więc nie można zamówić przez identyfikator? Więcej informacji na temat błędu

Unable to cast the type 'System.Int16' to type 'System.Object'.

I zdefiniować orderbyLambda jak Expression<Func<E, object>> orderbyLambda

EDIT:

Prawdziwy zabójca jest, jeśli mogę to zrobić:

orderbyLambda: p => new { p.ID } 

to działa ... Czemu?

Odpowiedz

15

Jest to wykrywanie "porządku przez {obiekt}" i paniki; wie, jak zamówić przez string, int, short, DateTime, itp. - ale object jest nieco zbyt niejasne.

Będziesz potrzebował prawidłowego wpisania lambda; najprostszym rozwiązaniem byłoby, aby Get generycznych, czyli

.... Get<TIdentity>(
     Expression<Func<E, TIdentity>> orderbyLambda, int page, int pageSize) 

, a następnie:

orderbyLambda: p => p.ID 

powinien (bez ciebie zmiany kodu na rozmówcy) automatycznie sprawiają, że Get<short>(...) w tym przypadku poprzez typu rodzajowego wnioskowanie. Inną opcją jest pozostawienie go jako <E,object>, ale ponowne zapisanie drzewa wyrażeń w odbiorniku. Więcej pracy.

+3

orderbyLambda: p => nowy {p.ID} działał ... Bardzo interesujący ... –

+5

Miałem podobny problem, próbując uczynić część OrderBy mojego API repozytorium. LINQ do Entities balked na OrderBy (e => e.SomeCollection.Count). Zmiana wyrażenia na OrderBy (e => new {e.SomeCollection.Count}) również działała dla mnie. – danludwig

+0

+1 do powyższego komentarza Olivehour, to też zadziałało. – Beyers

Powiązane problemy