2013-01-16 121 views
1

我有一個類,如:獲取計數使用LINQ和Entity Framework

public class Category 
{ 
    public int CategoryId { get; set; } 
    [Required] 
    public string Name { get; set; } 
    [NotMapped] 
    public int ProductCount { get; set; } 
    public virtual IEnumerable<Product> Products { get; set; } 
} 

我有一個目前看起來像這樣的查詢:

context.Categories.SortBy(sortByExpression).Skip(startRowIndex).Take(maximumRows) 

我需要包括我的類別網格中的ProductCount字段。是否可以擴展此LINQ查詢以在不讀取整個Product集合的情況下爲我提供ProductCount屬性?我可以在使用良好的舊SQL的子查詢中做到這一點,但我很難用LINQ。

感謝

回答

0

這是大致你在找什麼:

context.Categories.SortBy(sortByExpression).Skip(startRowIndex).Take(maximumRows) 
    .Select(c => new { c.CategoryId, c.Name, ProductCount = c.Products.Count() }); 

或有我誤解你的問題?

更新代碼

+0

'ProductCount'未映射(注意attribte),因此不能用於初始檢索值。我假設這個屬性是該查詢的結果將被存儲的地方。 –

+0

我明白了,那麼問題是Count()的實現對於我猜測的產品的集合類型是什麼。 'Select(c => new {c.CategoryId,c.Name,c.Products.Count()});'可能產生「合適的」SQL/Code /等。 –

+0

感謝您的建議。是的,ProductCount不存儲在數據庫中。我嘗試了上面的代碼,但我無法實現它的工作。正如所寫,它返回一個匿名類型,它不會編譯。如果我將它更改爲'c => new Category',我會得到「實體或複雜類型'Category'不能在LINQ to Entities查詢中構造。」我錯過了什麼嗎? – John

0

你的問題並不清楚足夠的,但如果我深知要在結果例如productCount新列和你的SQL查詢做了它象下面這樣:

SELECT c.*, , (SELECT COUNT(*) FROM Products p WHERE p.categoryId = c.id) AS productCount FROM 
Categories c 
WHERE <Conditions> 

現在,你希望能夠做到這一點使用LINQ(如果您的問題真的這樣),你可以如下做到這一點:

List<Category> categoryList = (from c in context.Categories let pCount = c.Products.Count() select 
new { categoryId = c.CategoryId, CategoryName = c.Name, productCount = pCount}) 
.OrderBy([sortByExpression]).Skip([startRowIndex]).Take([maximumRows]).ToList(); 

希望得到這個幫助。