在具有多个联接的Linq查询中无法对列进行分组

时间:2019-06-11 01:21:29

标签: linq model-view-controller group-by controller viewmodel

我有一个想传递给Razor视图的MVC ViewModel。在控制器中,我创建了一个数据库上下文,并使用Linq将表连接在一起。归纳汇总后,我得到一个错误:

  

错误CS1061'十进制'不包含'GroupBy'的定义,并且找不到可访问的扩展方法'GroupBy'接受类型为'decimal'的第一个参数(您是否缺少using指令或程序集引用?< / p>

我已经遍历了关于堆栈溢出和google的几乎每个示例,找不到与查询结构相匹配的示例。另外,MS的例子非常琐碎,用处不大。

这是控制器中的动作:

public IHttpActionResult GetEmployeeReleasedAllocatedBonus(int eid)
    {
        var employeeReleasedAllocatedBonus =
            (from br in _context.BonusReleases
                join emp in _context.Employees
                    on new
                    {
                        br.EmployeeID,
                        empID = br.EmployeeID
                    } equals new
                    {
                        emp.EmployeeID,
                        empID = eid
                    }
                join job in _context.Jobs on br.JobID equals job.JobID
                join bonus in _context.Bonus
                    on new
                    {
                        br.JobID,
                        empID = br.EmployeeID
                    }
                    equals new
                    {
                        bonus.JobID,
                        empID = bonus.EmployeeID
                    }
                select new EmployeeAllocatedReleasedBonusViewModel()
                {
                    AllocatedToEmployee = br.Amount, AllocatedPercentage = bonus.Amount * 100
                    ,
                    JobNumber = job.JobNumber, JobDescription = job.JobDescription

                })
            .ToList()
            .Sum(s => s.AllocatedToEmployee)
            .GroupBy(g => new {g.JobNumber, g.JobDescription, g.AllocatedPercentage});

        return Ok(employeeReleasedAllocatedBonus);
    }

值得一提的是,AllocatedPercentage数据类型是十进制。但是,我尝试将其更改为字符串,但错误消息仍然存在。

也尝试在.ToList()之前使用组功能,但这也不起作用。

2 个答案:

答案 0 :(得分:0)

ToList()之后,您有一个List<EmployeeAllocatedReleasedBonusViewModel>

Sum(s => s.AllocatedToEmployee)中,每个s都是一个EmployeeAllocatedReleasedBonusViewModel。显然,EmployeeAllocatedReleasedBonusViewModel具有属性AllocatedToEmployee,该属性可能是十进制类型。可以将其总计为小数点后一位。

Sum(十进制)的结果是您的GroupBy的输入。十进制类型是否有方法GroupBy?当然不是!

las,您忘了告诉我们您的要求。很难从不执行所需功能的代码中提取它们。

在我看来,您有两个一对多的关系:

  • Employees具有零个或多个BonusReleases。每个BonusRelease都属于使用外键的一个Employee
  • Jobs具有零个或多个BonusReleases。每个BonusRelease都完全属于一个Job

现在您想要什么:您要全部JobNumbers的{​​{1}}和JobDescriptions中的全部Jobs吗?我不确定AllocatedPercentage在此查询中的作用。

  

无论何时,只要您想要带有子项目的项目,例如学校和学生,订单的客户,订单的订单行的订单,都可以使用GroupJoin。如果相反,则是:所在学校的学生,与下订单的客户下订单,请使用加入。

Employees

还是您想要JobNumber / JobDescription /每个员工分配的总奖金?

var result = dbContext.Jobs.GroupJoin(dbContext.BonusReleases,
    job => job.Id,                       // from every Job take the primary key
    bonusRelease => bonusReleas.JobId,   // from every BonusRelease take the foreign key

    // parameter ResultSelector: take every Job with all its BonusReleases to make a new:
    (job, bonusReleasesOfThisJob) => new
    {
        JobNumber = job.JobNumber,
        JobDescription = job.JobDescription

        // do you want the total of all allocated percentages?
        TotalAllocatedPercentages = bonusReleasesOfThisJob
            .Select(bonus => bonus.Amount)
            .Sum(),
            // do something to make it a percentage

         // or do you want a sequence of allocated percentages?
         TotalAllocatedPercentages = bonusReleasesOfThisJob
            .Select(bonus => bonus.Amount)
            .ToList(),
});

答案 1 :(得分:0)

Harald的评论是关键-在ToList()之后,我有一个列表。因此,我退后一步说,如果先将结果放入匿名对象该怎么办。然后进行分组,然后进行求和,将最终结果放入视图模型。有效。这是答案。

module.exports = {
  siteMetadata: {
    title: 'Your site',
  },
  plugins: [
    // Gets rid of the service worker 
    'gatsby-plugin-remove-serviceworker'
  ]
}