繁体   English   中英

将SQL转换为LINQ的问题

[英]Issues in converting SQL to LINQ

我有一个如下所示的sql查询(出于疑问,表和列的名称是任意的):

select t3.MRIID as 'Ids'
from table1 t1  
    join table2 t2 with (nolock) on t1.ID = t2.SPID
    join table3 t3 with (nolock) on t2.ID = t3.SPMRID
    join table4 t4 on t4.MRID = t3.MRID
where 
    t3.MRISID = 18
    and t1.ID = 315
group by t3.MRIID
having SUM(CAST(t4.IRGPC AS INT)) > 0  

我正在尝试将其转换为等效的LINQ查询,这就是我到目前为止所拥有的。 当我在LINQPad中运行它时,这并没有给我预期的结果,并且想知道是否有人对我要去的地方有所解释? 我知道我的组/拥有条款是这里的问题,但不确定如何解决。

from t1 in table1
    join t2 in table2 on t1.ID equals t2.SPID
    join t3 in table3 on t2.ID equals t3.SPMRID
    join t4 in table4 on t3.MRID equals t4.ID
where t3.MRISID == 18 && t1.ID == 315
group new { t1, t2, t3, t4 } by t3.MRID into groupedResult
let count = groupedResult.Count()
where count > 0
select new { Something = groupedResult.Key}

与Linq查询相比,SQL查询给我2个“ Ids”的结果是预期的,而给我3个,其中1个“ Id”与having子句不匹配

帮助极大的赞赏!

[更新]我刚刚注意到我在sql查询中的hading子句在Linq等效项中不存在,并且正在尝试了解如何实现这一点?

根据Mrinal的解决方案(和聊天评论),我的LINQ现在位于

from t1 in table1
    join t2 in table2 on t1.ID equals t2.SPID
    join t3 in table3 on t2.ID equals t3.SPMRID
    join t4 in table4 on t3.MRID equals t4.ID
where t3.MRISID == 18 && t1.ID == 315
group Convert.ToInt32(cd.IRGPC) by mriw.MRIID into groupedResult
where groupedResult.Sum() > 0
select new { groupedResult.Key}

但是,这仍然与原始SQL语句的结果不匹配。 我通过LinqPad运行此linq查询,以查看生成的SQL,如下所示。

-- Region Parameters
DECLARE @p0 Int = 18
DECLARE @p1 Int = 315
DECLARE @p2 Int = 0
-- EndRegion
SELECT [t5].[MRIID] AS [Key]
FROM (
    SELECT SUM([t4].[value]) AS [value], [t4].[MRIID]
    FROM (
        SELECT CONVERT(Int,[t3].[IRGPC]) AS [value], [t2].[MRISID], [t0].[ID], [t2].[MRIID]
        FROM [table1] AS [t0]
        INNER JOIN [table2] AS [t1] ON [t0].[ID] = [t1].[SPID]
        INNER JOIN [table3] AS [t2] ON [t1].[ID] = [t2].[SPMRID]
        INNER JOIN [table4] AS [t3] ON [t2].[MRIID] = [t3].[ID]
        ) AS [t4]
    WHERE ([t4].[MRISID] = @p0) AND ([t4].[ID] = @p1)
    GROUP BY [t4].[MRIID]
    ) AS [t5]
WHERE [t5].[value] > @p2

如果这些额外的细节IRGPC帮助,则IRGPC列在SQL中是bit类型,在C#代码中是bool型。

有什么建议么?

尝试如下修改Linq查询:

from t1 in table1
join t2 in table2 on t1.ID equals t2.SPID
join t3 in table3 on t2.ID equals t3.SPMRID
join t4 in table4 on t3.MRID equals t4.ID
where t3.MRISID == 18 && t1.ID == 315
group new { t1, t2, t3, t4 } by t3.MRID into groupedResult
where groupedResult.Sum(y => (int)y.t4.IRGPC) > 0
select new { Something = groupedResult.Key }

修改:

groupedResult.Count() > 0更改为groupedResult.Sum(y => (int)y.t4.IRGPC) > 0 ,因为在Sql查询中您的having SUM(CAST(t4.IRGPC AS INT)) > 0 ,需要在Linq查询中复制

编辑1:

如OP所述, t4.IRGPC是布尔类型,用例是获取一个分组,该分组至少具有一个true值,请尝试以下选项:

group t4.IRGPC by t3.MRID into groupedResult
where groupedResult.Any(x => x) 

代替

let count = groupedResult.Count()
where count > 0

使用where子句

where groupedResult.Sum(x => x.t4.IRGPC) > 0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM