簡體   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