[英]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)
)
)
);
所以我想做的是这样的:
- 我有一个要过滤的产品集。
- 对于实现
ITextEntity
的几种类型的ITextEntity
,都有一组该类型的实体。- 每个对象O具有一组产品OP。
- 对于产品中的每个产品产品,
对于每个集合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.