【问题标题】:Adding Count Column to LINQ query Based on Joined Table将计数列添加到基于联接表的 LINQ 查询
【发布时间】:2017-09-23 00:29:57
【问题描述】:

所以我创建了一个 SQL 视图,它提供了我需要的东西。本质上,它是一个工作职位计费系统,显示有多少职位被授权与填补(或分配)。

SELECT Companies.Name AS Company, Grades.Name AS Grade, Series.Name
AS Series, Positions.Authorized, COUNT(People.PersonId) AS Assigned

FROM Companies INNER JOIN
     Positions ON Companies.Id = Positions.CompanyId INNER JOIN
     Series ON Positions.SeriesId = Series.Id INNER JOIN
     Grades ON Positions.GradeId = Grades.Id INNER JOIN
     People ON Positions.CompanyId = People.CompanyId AND
     Positions.SeriesId = People.SeriesId AND Positions.GradeId = People.GradeId

GROUP BY Companies.Name, Grades.Name, Series.Name, Positions.Authorized

现在我想做的是在 LINQ 查询中重新创建它。我几乎在我需要的地方找到了它;但是,我不知道如何在基于 People 表的末尾添加计数列。

这是我当前的 LINQ 查询:

var query = from a in db.Companies
            join b in db.Positions on a.Id equals b.CompanyId
            join c in db.Series on b.SeriesId equals c.Id
            join d in db.Grades on b.GradeId equals d.Id
            join e in db.People on new { b.CompanyId, b.SeriesId, b.GradeId } equals new { e.CompanyId, e.SeriesId, e.GradeId }
            group a by new { CompanyName = a.Name, GradeName = d.Name, SeriesName = c.Name, b.Authorized, e.PersonId } into f
            select new { Company = f.Key.CompanyName, Grade = f.Key.GradeName, Series = f.Key.SeriesName, f.Key.Authorized, Assigned = /* needs to be Count(People.PersonId) based on last join */ )};

提前感谢您提供的任何帮助!

【问题讨论】:

    标签: c# sql linq asp.net-mvc-5 entity-framework-6


    【解决方案1】:

    想通了。它发布多行并且没有对同一行进行正确计数的原因是因为在我的“分组依据”中,我在“e.PersonId”中添加了它应该被简单地删除的时候。我还必须添加一些内容以使其在前端剃刀视图上工作,因为它是匿名类型(这与原始问题没有任何关系,但我认为我会给出更改的理由)。所以删除他们答案的人,你是部分正确的,但它不起作用的原因是因为组中的额外字段:

    dynamic query = (from a in db.Companies
                        join b in db.Positions on a.Id equals b.CompanyId
                        join c in db.Series on b.SeriesId equals c.Id
                        join d in db.Grades on b.GradeId equals d.Id
                        join e in db.People on new { b.CompanyId, b.SeriesId, b.GradeId } equals new { e.CompanyId, e.SeriesId, e.GradeId }
                        group a by new { CompanyName = a.Name, GradeName = d.Name, SeriesName = c.Name, b.Authorized } into f
                        select new { Company = f.Key.CompanyName, Grade = f.Key.GradeName, Series = f.Key.SeriesName, Authorized = f.Key.Authorized, Assigned = f.Count()}).AsEnumerable().Select(r => r.ToExpando());
    

    以及它在页面上的样子:

    【讨论】:

      猜你喜欢
      • 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
      相关资源
      最近更新 更多