Помогите мне понять: "LINQ to Entities поддерживает только листинг примитивных типов данных Entity Data Model"

У меня есть единица работы и репозиторий с использованием EF 4 и POCOs. Поскольку EF требует упорядоченного набора, прежде чем он сможет пропустить() и Take(), я добавил следующий unit test (без mocks), чтобы вытащить запись, чтобы увидеть, если она сработала.

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

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

Так почему же это не удается выполнить по ID? Подробнее об ошибке

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

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

EDIT:

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

 orderbyLambda:  p => new { p.ID }

Это работает... Почему?

Ответ 1

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

Вам понадобится правильная типизация лямбда; самым простым подходом было бы сделать Get generic, т.е.

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

а затем:

orderbyLambda: p => p.ID

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