当我尝试在Where子句中使用界面时,为什么L2E会cho之以鼻?
-
29-09-2019 - |
题
我有一个对实体查询(使用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
界面。我想使用这些集合来过滤一个序列 Product
s以半雕刻的方式。这是代码:
List<IEnumerable<ITextEntity>> InclusiveFilters;
IQueryable<Product> Products;
//...snip...
Products = Products.Where(prod =>
InclusiveFilters.All(filter =>
filter.Any(iTextEnt =>
iTextEnt.Product.Contains(prod)
)
)
);
所以我要做的就是这样:
- 我有一个我想过滤的产品。
- 对于实现的几种类型
ITextEntity
, ,有一组该类型的实体。- 每个对象o都有一组产品。
- 对于产品中的每种产品,
对于每个集合,
对于至少一个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()
).