如何将具有聚合函数的T-SQL转换为LINQ?

时间:2016-11-22 12:59:03

标签: linq tsql

我有一个带有T-SQL的复杂脚本,我无法将其转换为LINQ语法:

SELECT cc.ContractID,
       Max(CASE WHEN cc.CompanyID = vc.CompanyID THEN vc.CompanyTitle END) AS CompanyID,
       Max(CASE WHEN cc.ContractorID = vc.CompanyID THEN vc.CompanyTitle END) AS ContractorID
FROM   ConContracts cc
       JOIN ViewCompanies vc
         ON vc.CompanyID IN ( cc.CompanyID, cc.ContractorID )
GROUP  BY cc.ContractID 

任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:2)

我使用Linqer尝试转换此查询,最后得到:

from cc in db.ConContracts
from vc in db.ViewCompanies
where
  vc.CompanyID == cc.CompanyID ||
  vc.CompanyID == cc.ContractorId
group new {cc, vc} by new {
  cc.ContractID
} into g
select new {
  g.Key.ContractID,
  CompanyID = g.Max(p => (p.cc.CompanyID == p.vc.CompanyID ? p.vc.CompanyTitle : null)),
  ContractorID = g.Max(p => (p.cc.ContractorId == p.vc.CompanyID ? p.vc.CompanyTitle : null))
}

我不是LINQ专家,所以不确定这是否是一个有效的答案,但如果它至少在功能上令人满意,可能会有所帮助或有趣,因为这意味着你可以使用它Linqer回答你的问题。

答案 1 :(得分:0)

这与您的T-SQL完全等效,但我怀疑它可能会为您提供所需的结果。

我怀疑ContractID对于您的ConContracts表是唯一的,而CompanyID对于ViewCompanies表是唯一的,因此只有在您使用group by时才需要添加max。

因此,如果您的表格定义正确,您可以执行类似

的操作
(from cc in ConContracts
select new
{
    cc.ContractID,
    CompanyID    = cc.Company.CompanyTitle,
    ContractorID = cc.Contractor.CompanyTitle
}