У меня есть запрос 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)
)
)
);
Итак, я пытаюсь сделать следующее:
- У меня есть набор продуктов, которые я хочу отфильтровать.
- Для каждого из нескольких типов, которые реализуют
ITextEntity
, существует набор объектов S этого типа. - Каждый объект O имеет набор OP продуктов.
- Для каждогоПродукт в продуктах,для каждого набора S,по крайней мере, один O в S,ОП должен содержать прод.Если нет, удалите prod из Products.
Как видите, это довольно сложно.
У меня такое ощущение, что это связано с тем, что LINQ не может работать с типом ITextEntity
, а не с моими операциями над множествами.Тем не менее, сложность вышеописанного затрудняет работу с ним и затрудняет поиск альтернативы без LINQ.Будет довольно уродливо, если я не смогу использовать LINQ.
Я нашел страницу MSDN и Поток переполнения стека , где обсуждались подобные исключения, но ни многоПомогите. Другой поток SO нацелен на мое использование метода Contains
, но из-за сложности здесь у меня не было особой удачи, пытаясь заменить его методом BuildOrExpression ,Я сомневаюсь, что BuildOrExpression будет работать в любом случае, так как это EF 4 и предполагается, что Contains
будет поддерживаться.
Так что я довольно застрял здесь.Кто-нибудь может посоветовать?
РЕДАКТИРОВАТЬ : На этот вопрос был дан ответ в августе 2010 года, но я вернулся, чтобы очистить заголовок и описание.