我正在努力寻找合适的语法来复制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')中占有一席之地,而不会以任何方式影响您的数据库。
参见如何在实体框架中计算关联实体而不获取它们