У меня есть 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 #.
Есть предложения?