如何使用聚合函数与LINQ加入?(How to use aggregate functions in

2019-09-26 13:09发布

你好我写LINQ查询来获取最大计数与来自两个表的列。 我写的SQL查询,它下面是。

select MAX(p.dispalyOrder) from NCT_Process p INNER JOIN NCT_Process_Settings s ON 
p.projectId =s.projectId AND p.level=s.level 

我试图如下LINQ。

dbObject = (from c in entityObject.NCT_Process_Settings
            join process in entityObject.NCT_Process on c.projectId equals process.projectId
            join level in entityObject.NCT_Process on c.level equals level.level
            select new settingsobject
            {
                MAX(p.dispalyOrder) to some propert of settingsobject
            }).Tolist();

我不知道如何从进程表中最大的显示顺序。 任何帮助,将不胜感激。 谢谢。

Answer 1:

您只需选择值,然后调用Max的查询。 还加入你必须创建匿名类与要匹配的列多列。

max = (from c in entityObject.NCT_Process_Settings
       join p in entityObject.NCT_Process 
       on new { c.projectId, c.level } equals new { p.projectId, p.level }
       select p.dispalyOrder).Max();

如果您有其他栏目也希望聚合,那么你可以通过在一个恒定值做一组。

result = (from c in entityObject.NCT_Process_Settings
          join p in entityObject.NCT_Process 
          on new { c.projectId, c.level } equals new { p.projectId, p.level }
          group new{c,p} on 1 into grp
          select new {
              MaxDisplayOrder = grp.Max(x => x.p.dispalyOrder),
              AvgOfSomething = grp.Avgerage(x => x.c.Something),
              MinOfASum = grp.Min(x => x.p.SomeNumber + x.c.SomeOtherNumber)
          }).Single();

注意使用的Single ,因为在一个恒定的一群只会造成一行。

或者,如果你只是想获得由另一列分组的最大显示顺序,然后做到这一点

result = (from c in entityObject.NCT_Process_Settings
          join p in entityObject.NCT_Process 
          on new { c.projectId, c.level } equals new { p.projectId, p.level }
          group p.displayOrder on c.Id into grp
          select new {
              MaxDisplayOrder = grp.Max(),
              Id = grp.Key
          }).ToList();

请注意, Key是无论你在之后把ongrp是值的集合之前的on 。 在这种情况下,可以有多个结果,所以你最好使用ToList运行查询。



文章来源: How to use aggregate functions in linq with joins?