LinqToEntities行和相关实体计数



我正在努力寻找合适的语法来复制Linq-to-Entities中的以下SQL:

SELECT 
    company.*, count(people.companyid) as cnt  
FROM company 
INNER JOIN people on company.id = people.companyid
GROUP BY company.id

我有一个在数据库中定义的外键关系,随后在实体框架模型(.edmx)

我已经禁用了延迟加载,所以我认为我需要包括相关的表(人),但是在我的剃刀视图(公司列表)中,对每一行进行计数似乎效率低下。也就是说,它将为每个公司填充一个人员集合。

    @foreach (var item in Model)
    {
//..... 
     <label>Company Members:</label>
     <div>@item.people.count</div>
    }

示例显示如何为单个实体执行此操作,但我需要为每个公司执行此计数

<!-- language: lang-c#-->
    using (var context = new UnicornsContext())
    {
        var princess = context.Princesses.Find(1);
        // Count how many unicorns the princess owns 
        var unicornHaul = context.Entry(princess)
                              .Collection(p => p.Unicorns)
                              .Query()
                              .Count();
    }

这可能相当于您的查询

from c in context.Companies
group c by c.Id into g
select new {Company = g.First(), CNT = g.First().People().Count}

如果你需要的话,你根本不需要做groupby

from c in context.Companies
//group c by c.Id into g
select new {Company = c, CNT = c.People().Count}

将匿名类型返回给视图可能会很棘手,正如您所注意到的。而不是一个视图模型(和所有的开销和维护),你可以添加一个属性到你的模型,但从System.ComponentModel.DataAnnotations.Schema命名空间标记它[NotMapped]。这使您在对象本身(而不是'sidecar')中占有一席之地,而不会以任何方式影响您的数据库。

参见如何在实体框架中计算关联实体而不获取它们

相关内容

  • 没有找到相关文章

最新更新