2011-12-01 117 views
4

我正在使用實體框架4.1使用代碼優先方法。我有兩個展現父母與子女關係的實體。爲了提供一個具體的例子,假設我有一個Category實體,它有與之關聯的零對多Product個實體。我已經設置了導航屬性(在我的示例中,Category實體將具有ICollection<Product>屬性,而Product實體具有Category屬性)。返回父記錄時有效獲取子記錄的計數

現在,當我得到Category個實體時,我還想要返回個數個子類別的子記錄數。我知道我可以這樣做:

Category category = dbContext.Categories.Single(...); 
int productCount = category.Products.Count(); 

但我擔心,因爲這被髮送到數據庫生成的SQL取決於我能否使用延遲或預先加載。

在第一種情況下(延遲加載),在調用Products集合提示EF運行SQL查詢,如:

SELECT ... all columns ... 
FROM Products 
WHERE CategoryID = @CategoryID 

在第二種情況下(預先加載),該產品被加載時,類別信息被檢索到,所以沒有對數據庫進行第二次查詢,但缺點是如果我對產品不感興趣(除了它們的計數),那麼我會帶回大量不需要的數據。

我希望它有兩全其美:即只有一個數據庫查詢的能力和使用SELECT COUNT(*)的能力,而不是從表中獲取所有列的能力。總之,我想SQL像下面這樣被髮送到數據庫:

SELECT ... all category columns ..., 
     (SELECT COUNT(*) FROM Products p WHERE p.CategoryID = c.CategoryID) 
FROM Categories c 
WHERE c.CategoryID = ... 

是,在所有可能的EF或者是什麼,我希望有一個白日夢?

回答

4

不知道,但也許試試這個:

var result = db.Categories.Where(x => x.CategoryId == categoryId) 
          .Select(y => new 
           { 
           Count = y.Products.Count(), 
           Category = y 
           }) 
          .Single(); 

//result.Count 

//result.Category