Привести результаты linq к списку <MyInterface> - PullRequest
8 голосов
/ 01 сентября 2009

Я расширил свои сущности для реализации определенных интерфейсов для своего типа. Я пытаюсь выполнить следующий запрос:

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

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

Тем не менее, я получаю следующую ошибку:

«LINQ to Entities поддерживает только приведение типов примитивов модели данных Entity»

По сути, я всегда хочу преобразовать результаты из необработанного типа сущности в общий список интерфейса, который он реализует.

Возможно ли это?

Ответы [ 3 ]

20 голосов
/ 01 сентября 2009

Вы можете выполнить приведение на клиенте, минуя слой трансляции запросов платформы сущностей, вызвав AsEnumerable метод расширения:

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

Однако лучше поменять порядок выполнения проверки Count:

var list = results.AsEnumerable().Cast<IApplicationEntity>().ToList();
return list.Count == 0 ? null : list;
3 голосов
/ 01 сентября 2009

Если вы хотите привести результаты к сложному типу, вам нужно заставить код использовать LINQ to Objects, а не LINQ to Entities.

Вызов метода расширения AsEnumerable до приведения - вот хитрость.

Попробуйте следующее:

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

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

Также обратите внимание, что не стоит проверять Count() на перечислимом, поскольку это означает, что коллекция повторяется дважды.

0 голосов
/ 01 сентября 2009
return results.Count() > 0 ? 
results.Select(result => (IApplicationEntity)result)
.ToList() : null;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...