将SQL转换为LINQ

时间:2018-10-02 18:18:58

标签: c# sql linq sql-to-linq-conversion

我有一个如下所示的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个预期的结果,与Linq查询相比,给我3个,其中1个“ Id”与having子句不匹配

非常感谢您的帮助!

[UPDATE]我刚刚注意到我在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列在SQL中为bit类型,而在C#代码中为bool类型。

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

尝试如下修改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) 

答案 1 :(得分:0)

代替

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

使用where子句

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