我有一个对实体查询(使用EF 4)的LINQ,该查询有一些非常复杂的基于设置的过滤。代码编译正好,但是当我尝试运行它时,我会收到以下错误:

无法创建类型“ iTextentity”的恒定值。在这种情况下,仅支持原始类型(例如'int32,String和GUID')。

现在用于代码。我有一个看起来像这样的界面:

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

这个想法是这些“文本实体”表示查找表存储的属性 Product. 。如果产品具有颜色,则所有红色产品都将包含带有TextValue =“ Red”的颜色实体,并且将有一个用此接口装饰的颜色实体:

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

Itextentities可能具有1:n或n:n的关系回到 Product.

我有一个嵌套的收藏(实际上是一个 List<IEnumerable<ITextEntity>>)包含实施不同实体的集合 ITextEntity 界面。我想使用这些集合来过滤一个序列 Products以半雕刻的方式。这是代码:

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都有一组产品。
  4. 对于产品中的每种产品,
    对于每个集合,
    对于至少一个o,
    OP必须包含产品。如果不是,请从产品中删除产品。

如您所见,这很复杂。

我感觉这是由于Linq无法与 ITextEntity 类型,而不是我的设定操作问题。但是,以上的复杂性使得很难使用,并且很难找到非Linq替代方案。如果我不能使用Linq,它将变得非常丑陋。

我发现 MSDN页面堆栈溢出线程 讨论类似的例外,但两者都没有帮助。 另一个SO线程 瞄准我的使用 Contains 方法,但是由于这里的复杂性,我没有太多运气试图用 buildorexpression 方法。我怀疑BuildoreXpressy无论如何都会起作用,因为这是EF 4和 Contains 应该得到支持。

所以我宁愿呆在这里。谁能建议?

编辑: :这个问题在2010年8月回答,但我回来清理标题和描述。

有帮助吗?

解决方案

你隐含地铸造 ITextEntity. 。但 ITextEntity 不是您实体数据模型的一部分,因此EF不知道如何将其成员转化为SQL。 Contains 受支持,但仅具有原始或实体类型。另外,您使用 IEnumerable, ,这也防止翻译为SQL;你需要 IQueryable 可转换为SQL。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top