Linq To Entities行和相关实体计数

时间:2014-03-15 16:31:14

标签: c# asp.net-mvc linq entity-framework linq-to-entities

我很难找到合适的语法来复制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();
    }

2 个答案:

答案 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