Помогите мне понять "LINQ to Entities поддерживает только приведение типов примитивов Entity Data Model" - PullRequest
10 голосов
/ 10 февраля 2011

У меня есть единица работы и хранилище, использующее EF 4 и POCO. Так как EF требует упорядоченного набора, прежде чем он сможет пропустить () и Take (), я добавил следующий модульный тест (без насмешек), просто чтобы вытащить запись, чтобы посмотреть, работает ли она.

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

Это приводит к выражению orderbyLambda = {p => Convert(p.ID)} и ошибке при перечислении. Идентификатор: tinyint (Int16 / короткий)

Так почему же это невозможно заказать по идентификатору? Подробнее об ошибке

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

Я определяю orderbyLambda как Expression<Func<E, object>> orderbyLambda

EDIT:

Настоящий убийца, если я сделаю это:

 orderbyLambda:  p => new { p.ID }

Работает ... Почему?

1 Ответ

15 голосов
/ 10 февраля 2011

Это обнаружение "порядка по {объекту}" и паника; он знает, как сделать заказ по string, int, short, DateTime и т. д., но object слишком расплывчато.

Вам понадобится настоящая лямбда, чтобы быть набранным правильно; самый простой подход - сделать Get универсальным, то есть

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

и затем:

orderbyLambda: p => p.ID

должен (без изменения кода у вызывающей стороны) автоматически сделать это Get<short>(...) в этом случае с помощью вывода общего типа. Другой вариант - оставить его как <E,object>, но переписать дерево выражений в получателе. Больше работы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...