代码之家  ›  专栏  ›  技术社区  ›  Legion

如何将select max语句从sql转换为linq转换为sql?

  •  0
  • Legion  · 技术社区  · 6 年前

    我正在尝试将此SQL语句转换为Linq to SQL。

    SELECT [PurpCode],
    MAX(([PurpCode] + ' - ' + [Purpose])) AS [PurposeName]
    FROM [dbo].[CCM]
    WHERE [PurpCode] IS NOT NULL AND [PurpCode] <> ''
    GROUP BY [PurpCode]
    ORDER BY [PurpCode]
    

    我已经做到了:

        db.CCM
          .Where(ccm.PurpCode != null && ccm.PurpCode != "")
          .Select(ccm => new { ccm.PurpCode, PurposeName = ccm.PurpCode + " - " + ccm.Purpose })
          .Max(ccm => ccm.PurposeName)
          .GroupBy(ccm => ccm.) //Properties on ccm disappear after .Max
          .OrderBy(ccm => ccm.) 
    

    Max 在Linq中的工作方式似乎与在SQL中的工作方式不同。我在SQL Server中使用它作为准 DISTINCT 这只对purposename列有效。之后做任何事的企图 .Max 不起作用,因为所有属性都丢失了 ccm .

    1 回复  |  直到 6 年前
        1
  •  2
  •   Cam Bruce    6 年前

    使用 OrderBy 要对每个组的元素排序,请使用 FirstOrDefault .

    db.CCM
        .Where(ccm.PurpCode != null && ccm.PurpCode != "")
        .Select(ccm => new { ccm.PurpCode, PurposeName = ccm.PurpCode + " - " + ccm.Purpose })
        .GroupBy(ccm => ccm.PurpCode)
        .Select(grp=> new {  
              grp.Key, 
              PurposeName = grp.OrderBy(x=> 
                  x.PurposeName).FirstOrDefault() });