使用LINQ和实体框架获取延迟加载的子集合的计数

时间:2013-01-16 00:15:05

标签: c# 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查询以向我提供ProductCount属性而无需读取整个Product集合?我可以使用旧的SQL在子查询中执行此操作,但我使用LINQ难以接受。

由于

2 个答案:

答案 0 :(得分:0)

这大致是你要找的东西:

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

还是我误解了你的问题?

更新了代码

答案 1 :(得分: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();

希望得到这个帮助。