【问题标题】:How to convert SQL statement to LINQ?如何将 SQL 语句转换为 LINQ?
【发布时间】:2021-12-17 23:13:01
【问题描述】:

我的问题是使用另外 4 个不同的列类型来提取不同的 PartId,就像 SQL 查询一样。图 1 显示了我想要的输出。问题是,如果我们假设我们默认使用 dBcontext,我如何使用 LINQ 和 EF Core 解决同样的问题。更重要的是假设对象 ApprovalNumberRecord 是 DbSet 并且可以导航到 Part 和 Approval 对象。

SELECT
    B.PartId
    ,Sum(Case when B.ApprovalName = 'R-67' then 1 Else 0 End) as [R-67]
    ,Sum(Case when B.ApprovalName = 'R115' then 1  Else 0 End) as [R115]
    ,Sum(Case when B.ApprovalName = 'LPG-D' then 1  Else 0 End) as [LPG-D]
    ,Sum(Case when B.ApprovalName = 'CNG-D' then 1  Else 0 End) as [CNG-D]
FROM
    (SELECT 
         anr.PartId
         ,a.ApprovalName
         ,anr.IsVisible
         ,p.[Description]
     FROM 
         ApprovalNumberRecord AS anr
     LEFT JOIN
         Parts AS p ON anr.PartId = p.Id
     LEFT JOIN
         Approvals AS a ON anr.ApprovalId = a.Id) AS B 
GROUP BY
    B.PartId

Output of SQL statement

这是内部的 SELECT 输出:

OUTPUT of inner SQL statement

在数据库模型之下:

ApprovalNumberRecord 类:

... //other fields and properties

public Part Part { get; set; }
public Approval Approval { get; set; }

零件类:

public Producer Producer{ get; set; }
public Category Category { get; set; }
public ICollection<ApprovalNumberRecord> ApprovalNumberRecords { get; set; }

审批等级:

none navigation objects inside

【问题讨论】:

  • 请展示您如何将数据库模型映射到 EF 类。我们需要查看导航属性。另外,Please don't post code, exceptions, or results as images。它们不能被复制(部分)用于回答,它们的“文本”不会出现在搜索引擎中。
  • 嗨@GertArnold 我认为它足够清晰透明,可以正确提问。感谢您的意见。

标签: sql entity-framework linq case distinct


【解决方案1】:
var innerQuery =
  from anr in dbContext.ApprovalNumberRecords
  let p = anr.Part
  let a = anr.Approval
  select new { anr.PartId, a?.ApprovalName, anr.IsVisible, p?.Description };

var groupQuery =
  from B in innerQuery
  group B by B.PartId into g
  select new {
    PartId = g.Key,
    R_67 = g.Sum(x => x.ApprovalName == 'R-67' ? 1 : 0),
    R115 = g.Sum(x => x.ApprovalName == 'R111' ? 1 : 0),
    LPG_D = g.Sum(x => x.ApprovalName == 'LPG-D' ? 1 : 0),
    CNG_D = g.Sum(x => x.ApprovalName == 'CNG-D' ? 1 : 0)
  };

【讨论】:

  • PartId : 应该是PartId =,其他人也一样。
  • @AmyB 这正是我在我的问题中想要的。 VS 编译器注意到的唯一一件事是错误 CS8072innerQuery 的匿名记录不能包含 a?.ApprovalNamep?.Description 的空运算符:“表达式树 lambda不得包含空传播运算符”。我还有一个问题,如果我想在groupQueryPart.Nameanr.IsVisible 列中看到呢?
猜你喜欢
  • 2013-02-15
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-24
相关资源
最近更新 更多