Проблемы при конвертации SQL в LINQ - PullRequest
0 голосов
/ 02 октября 2018

У меня есть 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}

Запрос SQL дает мне 2 «идентификатора» в результате, что ожидается по сравнению с запросом Linq, дающим мне 3из которых 1 'Id' не совпадает с предложением having

Помощь с благодарностью!

[ОБНОВЛЕНИЕ] Я только что заметил, что мое предложение наличия в запросе sql не является тем, что есть в 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.Я выполнил этот запрос linq через LinqPad, чтобы увидеть сгенерированный 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 имеет тип bit в SQL и bool введите код C #.

Есть предложения?

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Попробуйте изменить запрос 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) 
0 голосов
/ 02 октября 2018

Вместо

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

используйте выражение where

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