Помогите мне понять: "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>
, но переписать дерево выражений в приемнике. Больше работы.