Почему L2E задыхается, когда я пытаюсь использовать интерфейс в моем предложении Where? - PullRequest
0 голосов
/ 19 августа 2010

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

Невозможно создать постоянное значение типа 'ITextEntity'.В этом контексте поддерживаются только примитивные типы (такие как Int32, String и Guid).

Теперь для кода.У меня есть интерфейс, который выглядит следующим образом:

public interface ITextEntity
{
    int ID { get; set; }
    string TextValue { get; set; }
    EntityCollection<Product> Products { get; set; }
}

Идея состоит в том, что эти "Текстовые объекты" представляют собой таблицы поиска, хранящие свойства Product.Если у Продуктов есть цвет, все красные Продукты будут содержать объект Color с TextValue = "Red", и будет объект Color, украшенный этим интерфейсом:

public partial class Color : ITextEntity 
{ 
    //ID, TextValue, and Products implemented in EF-generated code
}

ITextEntities может иметь 1: N или NОтношения: N обратно к Product.

У меня есть вложенная коллекция (фактически List<IEnumerable<ITextEntity>>), которая содержит наборы различных сущностей, реализующих интерфейс ITextEntity.Я хочу использовать эти наборы для фильтрации последовательности Product с полуинклюзивным способом.Вот код:

List<IEnumerable<ITextEntity>> InclusiveFilters;
IQueryable<Product> Products;

//...snip...

Products = Products.Where(prod => 
    InclusiveFilters.All(filter => 
        filter.Any(iTextEnt => 
            iTextEnt.Product.Contains(prod)
        )
    )
);

Итак, я пытаюсь сделать следующее:

  1. У меня есть набор продуктов, которые я хочу отфильтровать.
  2. Для каждого из нескольких типов, которые реализуют ITextEntity, существует набор объектов S этого типа.
  3. Каждый объект O имеет набор OP продуктов.
  4. Для каждогоПродукт в продуктах,для каждого набора S,по крайней мере, один O в S,ОП должен содержать прод.Если нет, удалите prod из Products.

Как видите, это довольно сложно.

У меня такое ощущение, что это связано с тем, что LINQ не может работать с типом ITextEntity, а не с моими операциями над множествами.Тем не менее, сложность вышеописанного затрудняет работу с ним и затрудняет поиск альтернативы без LINQ.Будет довольно уродливо, если я не смогу использовать LINQ.

Я нашел страницу MSDN и Поток переполнения стека , где обсуждались подобные исключения, но ни многоПомогите. Другой поток SO нацелен на мое использование метода Contains, но из-за сложности здесь у меня не было особой удачи, пытаясь заменить его методом BuildOrExpression ,Я сомневаюсь, что BuildOrExpression будет работать в любом случае, так как это EF 4 и предполагается, что Contains будет поддерживаться.

Так что я довольно застрял здесь.Кто-нибудь может посоветовать?

РЕДАКТИРОВАТЬ : На этот вопрос был дан ответ в августе 2010 года, но я вернулся, чтобы очистить заголовок и описание.

1 Ответ

1 голос
/ 19 августа 2010

Вы неявно преобразуете в ITextEntity. Но ITextEntity не является частью вашей модели данных сущности, поэтому EF не знает, как перевести своих членов в SQL. Contains поддерживается, но только с типами примитивов или сущностей. Также вы используете IEnumerable, что также предотвращает перевод на SQL; вам нужно IQueryable для преобразования в SQL.

Таким образом, если вы удалите ссылку на интерфейс и IEnumerable, вы сможете выполнить запрос на сервере БД. В противном случае вам нужно перейти в L2O (например, AsEnumerable()).

...