簡體   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