C# T-SQL到LINQ查询,其中包含case语句和子查询
我是LINQ的完全初学者,我想在LINQ中转换这个T-SQL查询C# T-SQL到LINQ查询,其中包含case语句和子查询,c#,linq,tsql,sql-to-linq-conversion,C#,Linq,Tsql,Sql To Linq Conversion,我是LINQ的完全初学者,我想在LINQ中转换这个T-SQL查询 SELECT CASE WHEN D.IsBaseloadDefined = 1 THEN COUNT(D.DeviceID) ELSE (SELECT COUNT(DORG.DeviceID) FROM DeviceOrganization DORG INNER JOIN Organization ORG ON DORG.Organi
SELECT
CASE
WHEN D.IsBaseloadDefined = 1
THEN COUNT(D.DeviceID)
ELSE
(SELECT COUNT(DORG.DeviceID)
FROM DeviceOrganization DORG
INNER JOIN Organization ORG ON DORG.OrganizationID = ORG.OrganizationID
INNER JOIN BaseloadOrganization BO ON ORG.BaseloadOrganizationId = BO.OrganizationID
INNER JOIN Baseload BL ON BO.BaseloadID = BL.BaseloadID
WHERE DORG.DeviceID = D.DeviceID
AND BL.RecursUntil >= GETDATE()
GROUP BY DORG.DeviceID)
END AS [Nb of devices]
FROM DeviceOrganization DO
INNER JOIN Device D ON DO.DeviceID = D.DeviceID
LEFT JOIN BaseloadDevice BD ON D.DeviceID = BD.DeviceID
LEFT JOIN Baseload B ON BD.BaseloadID = B.BaseloadID AND B.RecursUntil >= GETDATE()
INNER JOIN OrganizationHierarchy OH ON DO.OrganizationID = OH.SubOrganizationID
WHERE OH.OrganizationID = 6
AND D.IsActive = 1
group by D.DeviceID, D.IsBaseloadDefined
到目前为止,我唯一能做的就是这样,现在我完全迷路了
来自_context.DeviceOrganizations中的DeviceCEO
在DeviceCEO.DeviceID上的_context.Devices中加入d等于d.DeviceID
将bd加入d.DeviceID上的_context.BaseloadDevices等于bd.DeviceID
在bd上的_context.Baseloads中加入b。BaseloadID等于b.BaseloadID
在DeviceCEO.OrganizationID等于oh.SubOrganizationID的环境中加入oh
其中oh.OrganizationID==OrganizationID
其中d.IsActive==true
其中b.recursive而不是get group count
组d.DeviceID by d.DeviceID).Count()
您应该将结果保存在变量中
var data = from deviceO in _context.DeviceOrganizations
join d in _context.Devices on deviceO.DeviceID equals d.DeviceID
join bd in _context.BaseloadDevices on d.DeviceID equals bd.DeviceID
join b in _context.Baseloads on bd.BaseloadID equals b.BaseloadID
join oh in _context.OrganizationHierarchies on deviceO.OrganizationID equals oh.SubOrganizationID
where oh.OrganizationID == OrganizationId
where d.IsActive == true
where b.RecursUntil <= DateTime.Now
我希望这能帮助您使用LinqPad
。。。这比在这里问一个对我有帮助的问题容易多了!我终于明白了逻辑,我想我现在可以做到。谢谢:)
//group by 2 properties
var result = data.GroupBy(d => new { d.DeviceID, d.IsBaseloadDefined })
.Select(g =>
{
//for each group we get IsBaseloadDefined property
var IsBaseloadDefined = g.Key.IsBaseloadDefined;
if (IsBaseloadDefined == 1)
{
return g.Count();
}
else
{
// here another select that return count:
//(SELECT COUNT(DORG.DeviceID)
//FROM DeviceOrganization DORG
// INNER JOIN Organization ORG ON DORG.OrganizationID = ORG.OrganizationID
//INNER JOIN BaseloadOrganization BO ON ORG.BaseloadOrganizationId = BO.OrganizationID
//INNER JOIN Baseload BL ON BO.BaseloadID = BL.BaseloadID
//WHERE DORG.DeviceID = D.DeviceID
//AND BL.RecursUntil >= GETDATE()
//GROUP BY DORG.DeviceID)
//in this query you should return Count() of group
return 1; //return group.Count() instead 1
}
});