繁体   English   中英

当我尝试在Where子句中使用接口时,为什么L2E会阻塞?

[英]Why does L2E choke when I try to use an interface in my Where clause?

我有一个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可以返回到Product具有1:N或N:N关系。

我有一个嵌套的集合(实际上是List<IEnumerable<ITextEntity>> ),其中包含实现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的几种类型的ITextEntity ,都有一组该类型的实体。
  3. 每个对象O具有一组产品OP。
  4. 对于产品中的每个产品产品,
    对于每个集合S,
    在S中至少有一个O
    OP必须包含产品。 如果不是,请从产品中删除产品。

如您所见,这非常复杂。

我感觉这是由于LINQ无法使用ITextEntity类型而不是我的设置操作有问题引起的。 但是,上述方法的复杂性使其难以使用,并且很难找到非LINQ的替代方案。 如果我不能使用LINQ,它将变得非常难看。

我发现一个MSDN页面和一个Stack Overflow线程讨论了类似的异常,但是两者都没有太大帮助。 另一个SO线程将手指指向我对Contains方法的使用,但是由于这里的复杂性,我没有很多运气尝试用BuildOrExpression方法替换它。 我怀疑BuildOrExpression是否可以正常运行,因为这是EF 4,并且应该支持Contains

所以我宁愿停留在这里。 有人可以建议吗?

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM