[英]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.