【问题标题】:How to use aggregate functions in linq with joins?如何在带有连接的 linq 中使用聚合函数?
【发布时间】:2017-08-16 00:18:47
【问题描述】:

您好,我正在编写 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();

我不确定如何从进程表中获取最大显示顺序。任何帮助,将不胜感激。谢谢。

【问题讨论】:

  • NCT_Process 和 NCT_Process_Settings 表之间是否有外键关系
  • 谢谢。不...

标签: c# linq asp.net-mvc-5


【解决方案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 是您放在 on 之后的任何内容,grpon 之前的值的集合。在这种情况下,可能会有多个结果,因此您可以使用 ToList 来运行查询。

【讨论】:

  • 谢谢。如何使用 displayorder 获取其他属性?
  • 如果你想要其他属性,那么你需要做一个group by。然后,这取决于您是否也在聚合它们,或者您是否真的想对它们进行分组并且只聚合 displayOrder。
  • 我可以举一些例子吗?
  • @NiranjanGodbole 好的,我添加了一个如何在一个查询中聚合多个列的示例。
  • 我在 c.Id 到 grp 的最后一个答案组 p.displayOrder 中收到语法错误
猜你喜欢
  • 2015-06-18
  • 1970-01-01
  • 2021-12-09
  • 1970-01-01
  • 2017-05-31
  • 1970-01-01
  • 2011-04-08
  • 2018-02-04
  • 2017-12-30
相关资源
最近更新 更多