EntityFramework Проблемы с кастингом - PullRequest
2 голосов
/ 22 октября 2010

Я строю свой запрос, используя PredicateBuilder из LinqKit.это здорово и делает именно то, что я ищу.

Чтобы сделать мой код более пригодным для повторного использования (таблицы и представления), я создал универсальный класс построителя предикатов:

public class LocalPredicateBuilder<T> where T : IResort
...
    var predicate = PredicateBuilder.True<T>(

, который предоставляет метод BuildPredicate.Я могу использовать его так:

var predicate = new LocalPredicateBuilder<Resort>().BuildPredicate();
var resorts = _entities.Resorts.Where(predicate).ToList();

, однако, когда я пытаюсь это сделать, я получаю эту ошибку времени выполнения (кстати, объекты сущности реализуют IResort): Невозможно привести тип 'ConsoleApplication1.Entities.Resort 'для ввода' ConsoleApplication1.Entities.IResort '.LINQ to Entities поддерживает только приведение типов примитивов модели данных сущностей

я пробовал приведение (не сработало):

var rlist = eq.Cast<Resort>().ToList();

Есть ли другой способ обойти эту проблему?

ОБНОВЛЕНИЕ

не очень повезло с получением предикатов для работы с использованием интерфейсов .. поэтому я решил мою проблему, перейдя с POCO.

Ответы [ 2 ]

0 голосов
/ 22 октября 2010

Ну, ошибка точная.Вы не можете сделать это в запросе L2E, потому что ваш интерфейс (IReport) не является частью вашей модели сущности и, следовательно, не может быть преобразован в SQL.Вы должны использовать тип сущности, а не интерфейс для этого.

0 голосов
/ 22 октября 2010

просто создайте частичный класс для объекта entity frameowrk и сделайте так, чтобы он реализовывал интерфейс.

другим способом было бы создать список того типа, который вам нуженкаждый из набора данных linq и добавьте элементы в коллекцию.

проблема вызвана тем, что .net не знает, как преобразовать List<ISomething> в List<Something>

...