我很难找到合适的语法来复制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行似乎效率低下。即它将填充每个公司的人员集合。
@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();
}
答案 0 :(得分:1)
这可能等同于您的查询
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}
答案 1 :(得分:0)
如您所述,将匿名类型返回到您的View可能会变得棘手。您可以向模型添加属性,但可以从[NotMapped]
命名空间标记System.ComponentModel.DataAnnotations.Schema
,而不是视图模型(以及所有开销和维护)。这样,您就可以在对象本身内(而不是“边车”中)占据一席之地,而不会以任何方式影响您的数据库。
请参阅How To Count Associated Entities Without Fetching Them In Entity Framework