0

我有一个 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)
        )
    )
);

所以我想做的是:

  1. 我有一组要过滤的产品。
  2. 对于实现 的几种类型中的每一种ITextEntity,都有一组该类型的实体。
  3. 每个对象 O 都有一组产品 OP。
  4. 对于 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 月得到回答,但我回来清理标题和描述。

4

1 回答 1

1

您正在隐式转换为ITextEntity. 但ITextEntity它不是您的实体数据模型的一部分,因此 EF 不知道如何将其成员转换为 SQL。Contains支持,但仅适用于原始类型或实体类型。此外,您使用IEnumerable,这也阻止了对 SQL 的转换;您需要IQueryable可转换为 SQL。

因此,如果您删除接口引用 和IEnumerable,您应该能够在数据库服务器上执行查询。否则,您必须进入 L2O(例如,AsEnumerable())。

于 2010-08-19T19:29:46.460 回答