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

C# 使用LINQ和实体框架获取延迟加载的子集合的计数,c#,linq,entity-framework,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;

我有一门课,比如:

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; }
}
我需要在我的分类网格中包括ProductCount字段。是否可以扩展此LINQ查询,以便在不读取整个产品集合的情况下为我提供ProductCount属性?我可以使用好的老SQL在子查询中实现这一点,但我在使用LINQ时遇到了困难


谢谢

这大概就是您想要的:

context.Categories.SortBy(sortByExpression).Skip(startRowIndex).Take(maximumRows)
    .Select(c => new { c.CategoryId, c.Name, ProductCount = c.Products.Count() });
还是我误解了你的问题


更新了代码

您的问题还不够清楚,但如果我理解清楚,您希望在结果中添加新列,例如productCount,您使用SQL查询完成了此操作,如下所示:

SELECT c.*, , (SELECT COUNT(*) FROM Products p WHERE p.categoryId = c.id) AS productCount FROM
Categories c
WHERE <Conditions>
现在,您希望能够使用LINQI实现这一点。如果您的问题真的是这样,您可以按如下方式进行:

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();

希望获得此帮助。

ProductCount未映射请注意属性,因此最初无法用于检索值。我假设这个属性是存储查询结果的地方。我明白了,那么问题是对于我猜的收集类型的产品,Count的实现是什么。选择c=>new{c.CategoryId,c.Name,c.Products.Count};可能会生成适当的SQL/Code/etc。感谢您的建议。是,数据库中未存储ProductCount。我尝试了上面的代码,但无法使其工作。在编写时,它返回一个匿名类型,并且不会编译。如果我将其更改为c=>newcategory,我将得到实体或复杂类型“Category”,不能在LINQ to Entities查询中构造。我遗漏了什么吗?你得到了什么编译错误?它将返回一个匿名类型,这是正确的。它是生成的SQL中SELECT语句的结果。它本质上应该和SQL中的子查询一样,我需要返回一个IEnumerable,因为它位于服务层。所以在查询结束时,我打电话给ToList。错误是无法将类型“List”隐式转换为“IEnumerable”。存在显式转换。是否缺少强制转换?。这就是我尝试c=>new Category的原因。不确定在哪里进行类型转换。
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();