我正在使用實體框架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或者是什麼,我希望有一個白日夢?