我有一个 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
。如果 Products 有颜色,那么所有红色的 Products 都会包含一个 TextValue = "Red" 的 Color 实体,并且会有一个 Color 实体用这个接口装饰:
public partial class Color : ITextEntity
{
//ID, TextValue, and Products implemented in EF-generated code
}
ITextEntities 可能有 1:N 或 N:N 关系回到Product
.
我有一个嵌套集合(实际上是 a ),其中包含实现接口List<IEnumerable<ITextEntity>>
的不同实体集。我想使用这些集合以半包容的方式ITextEntity
过滤一系列s。Product
这是代码:
List<IEnumerable<ITextEntity>> InclusiveFilters;
IQueryable<Product> Products;
//...snip...
Products = Products.Where(prod =>
InclusiveFilters.All(filter =>
filter.Any(iTextEnt =>
iTextEnt.Product.Contains(prod)
)
)
);
所以我想做的是:
- 我有一组要过滤的产品。
- 对于实现 的几种类型中的每一种
ITextEntity
,都有一组该类型的实体。- 每个对象 O 都有一组产品 OP。
- 对于 Products 中的每个 Product prod,
对于每个集合 S,
对于 S 中的至少一个 O,
OP 必须包含 prod。如果没有,请从产品中删除 prod。
如您所见,这非常复杂。
我有一种感觉,这是由于 LINQ 无法使用该ITextEntity
类型,而不是我的 set 操作有问题。但是,上述复杂性使得它难以使用,并且难以找到非 LINQ 替代方案。如果我不能使用 LINQ,它会变得非常难看。
我发现一个 MSDN 页面和一个Stack Overflow 线程讨论了类似的异常,但都没有太大帮助。另一个 SO 线程针对我对该Contains
方法的使用,但由于这里的复杂性,我没有太多运气尝试用BuildOrExpression方法替换它。我怀疑 BuildOrExpression 无论如何都会起作用,因为这是 EF 4 并且Contains
应该受到支持。
所以我比较卡在这里。任何人都可以建议吗?
编辑:这个问题在 2010 年 8 月得到回答,但我回来清理标题和描述。