【问题标题】:Converting SQL to LINQ With Sub Query使用子查询将 SQL 转换为 LINQ
【发布时间】:2021-12-11 08:37:26
【问题描述】:

我正在努力将以下 SQL 转换为 LINQ。谁能帮帮我:

   
 SELECT M.Id, M.borrower_id, M.application_id,  [borrower_first_name] ,[borrower_last_name], DP.ID, DP.masterline_id, PR.ID, PR.masterline_id
  FROM [dbo].[CCMemberizationPII] AS M
         LEFT JOIN 
          (SELECT  MAX(DP.ID) ID, DP.masterline_id
          FROM [dbo].[CCDailyPositions] AS DP 
          GROUP BY DP.masterline_id) DP
       ON DP.masterline_id = M.application_id
        LEFT JOIN 
          (SELECT  MAX(PR.ID) ID, PR.masterline_id
          FROM [dbo].[CCPurchase] AS PR
          GROUP BY PR.masterline_id) PR
       ON PR.masterline_id = M.application_id 
  order by M.Id 

【问题讨论】:

  • 一个好的开始是找到一个支持 LINQ 的 O/R 映射器。

标签: sql linq


【解决方案1】:

在构建 LINQ 查询时,尝试分解部分以构建最终查询。

var positions = 
    from dp in ctx.CCDailyPositions
    group by new { dp.masterline_id } into g
    select new 
    {
        ID = g.Max(x => x.ID),
        dp.masterline_id
    };

var purchases = 
    from pr in ctx.CCPurchase
    group by new { pr.masterline_id } into g
    select new 
    {
        ID = g.Max(x => x.ID),
        pr.masterline_id
    };

var query = 
    from m in ctx.CCMemberizationPII
    from dp in positions.Where(dp => dp.masterline_id == m.application_id)
        .DefaultIfEmpty()
    from pr in purchases.Where(pr => pr.masterline_id == m.application_id)
        .DefaultIfEmpty()
    orderby m.Id
    select new 
    {
        m.Id, 
        m.borrower_id, 
        m.application_id,  
        m.borrower_first_name,
        m.borrower_last_name, 
        DP_ID = dp.ID, 
        PR_ID = pr.ID, 
    };

您的查询也可以使用OUTER APPLY 编写。请注意,EF Core 可以使用窗口函数将 OUTER APPLY 转换为 LEFT JOIN。

var query = 
    from m in ctx.CCMemberizationPII
    from dp in ctx.CCDailyPositions.Where(dp => dp.masterline_id == m.application_id)
        .OrderByDescending(dp => dp.ID)
        .Take(1)
        .DefaultIfEmpty()
    from pr in ctx.CCPurchase.Where(pr => pr.masterline_id == m.application_id)
        .OrderByDescending(pr => pr.ID)
        .Take(1)
        .DefaultIfEmpty()
    orderby m.Id
    select new 
    {
        m.Id, 
        m.borrower_id, 
        m.application_id,  
        m.borrower_first_name,
        m.borrower_last_name, 
        DP_ID = dp.ID, 
        PR_ID = pr.ID, 
    };

哪种 SQL 更好,取决于您特定情况下的执行计划。

【讨论】:

  • 我最终使用了 OUTER APPLY。我从 LINQPad 中的 SQL 和 LINQ 得到相同的结果。您能否将我引荐到我可以了解此 OUTER APPLY 的任何网站。我可以编写 SQL,但发现很难将其转换为 LINQ。任何建议将不胜感激。
  • 您到底需要什么? LINQ怎么表达OUTER APPLY或者什么是OUTER APPLY?
  • 如何用LINQ表达OUTER APPLY!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-09
  • 1970-01-01
  • 2014-08-14
  • 1970-01-01
  • 1970-01-01
  • 2017-11-16
相关资源
最近更新 更多