2012-03-14 52 views
1

我在使用Code-First的實體框架中存在一個問題,我無法解決。任何屬性等於對象列表中的任何一個

有我的數據庫類型

public class Product { 
    public int ID {get; set; } 
    public virtual ICollection<Category> Categories { get; set; } 
} 

public class Category { 
    public int ID {get; set;} 
    public virtual ICollection<Product> Products { get; set; } 
    // rest omitted 
} 

的實體,我試圖讓二者具有給定分類的列表的至少一個類別的所有產品。我需要一個表達式,因爲此表達式稍後與其他表達式結合使用。

即,我想:

var searchFor = new List<Category>{...}; 
var expression = product => product.Categories.Any(cat => searchFor.Contains(cat)) 

執行此之後對一個DbContext

context.Products.Where(expression).ToList(); 

創建一個異常,說明主要是This context supports primitive types only

將其更改爲

var expression = product => product.Categories.Any(
           cat => searchFor.Any(d => d.ID == cat.ID)); 

擺脫對象比較沒有幫助的。我卡住了。我該如何管理?

回答

1

如果你已經有了類的列表,你可以建立標識名單之外查詢:

var searchForIds = searchFor.Select(x => x.ID).ToList(); 
var query = context.Products 
        .Where(product => product.Categories 
            .Any(cat => searchForIds.Contains(cat.ID))); 

我不知道,將工作,但它可能。 (道歉壓痕......它只是避免滾動。)

+0

完美的作品,THX – okrumnow 2012-03-14 08:03:29

2

你應該擺脫List<Category>,與ID列表替換它,就像這樣:

// I'm assuming that ID is of type long; please fix as necessary 
var searchFor = new List<long>{...}; 
var expression = product => 
    product.Categories.Any(cat => searchFor.Contains(cat.ID)) 
相關問題