【问题标题】:LinqToEntities row and related entity countLinqToEntities 行和相关实体计数
【发布时间】:2014-03-15 16:31:14
【问题描述】:

我正在努力寻找合适的语法来在 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();
    }

【问题讨论】:

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


    【解决方案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}
    

    【讨论】:

    • 谢谢,但是现在我需要将剃刀视图从模型 IEnumerable 更改为模型 List> 我认为模型不同?
    • 这将返回匿名对象列表,其中每个对象都有公司(公司类型)和计数(int),您可以决定如何将其发回,因为您不能真正返回匿名数据库。例如,您可以返回 KeyValuePair
    • 是的,我决定在 linqtoentities 选择中使用具有公司属性和 int32 属性的视图模型,而不是匿名类型欢呼
    【解决方案2】:

    如您所述,将匿名类型返回给您的 View 可能会很棘手。代替视图模型(以及所有开销和维护),您可以向模型添加属性,但从 System.ComponentModel.DataAnnotations.Schema 命名空间将其标记为 [NotMapped]。这为您在对象本身(而不是“sidecar”)中提供了一个位置,而不会以任何方式影响您的数据库。

    How To Count Associated Entities Without Fetching Them In Entity Framework

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多