C# T-SQL到LINQ查询,其中包含case语句和子查询

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

我是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.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
                }
            });