Я пытаюсь преобразовать SQL-запрос в LINQ, но мне нужно использовать HAVING Count (Distinct), что я не могу сделать в LINQ, и я не могу найти альтернативу для получения тех же результатов
SELECT
B.BranchCode ,
B.BranchName ,
rv.ENGINEER ,
CONVERT ( DATE, rv.VISITDATE ) [Date] ,
CONVERT ( TIME, rv.STARTTIME ) [Start] ,
COUNT ( DISTINCT rv.VISITID ) V
FROM
dbo.ltbl_Branch AS B
INNER JOIN dbo.tbl_contract AS C ON C.BranchCode = B.BranchCode
INNER JOIN dbo.tbl_repair_order AS r ON r.CONTRACT = C.Contract
INNER JOIN dbo.tbl_repair_visit AS rv ON rv.ORDERID = r.ORDERID
WHERE
CONVERT ( DATE, rv.VISITDATE ) BETWEEN '2019-02-01'
AND '2019-02-01'
AND ISNULL ( rv.FromHHT, 0 ) = 0
GROUP BY
B.BranchCode ,
B.BranchName ,
rv.ENGINEER ,
CONVERT ( DATE, rv.VISITDATE ) ,
CONVERT ( TIME, rv.STARTTIME )
HAVING
COUNT ( DISTINCT rv.VISITID ) > 1
Выше приведен SQL-запрос, который я пытаюсь преобразовать, и запрос LINQ, который у меня есть, находится ниже
from b in Ltbl_Branches
join c in Tbl_contracts on b.BranchCode equals c.BranchCode
join r in Tbl_repair_orders on c.Contract equals r.CONTRACT
join rv in Tbl_repair_visits on r.ORDERID equals rv.ORDERID
where rv.VISITDATE >= DateTime.Today.AddDays(-123)
&& rv.VISITDATE <= DateTime.Today.AddDays(-122)
&& rv.FromHHT == false
group b by new { b.BranchCode, b.BranchName, rv.ENGINEER, rv.VISITDATE,
rv.STARTTIME } into g
where g.Count() > 1
select new {
BranchCode = g.Key.BranchCode,
BranchName = g.Key.BranchName,
Engineer = g.Key.ENGINEER,
Date = g.Key.VISITDATE,
Time = g.Key.STARTTIME,
V = g.Count()
}
Это Количество подсчета (DISTINCT rv.VISITID)> 1, которым я являюсьизо всех сил пытаюсь работать в linq, я думаю, что остальная часть кода работает как задумано.
Я извлекаю данные из базы данных в сети, 1 февраля - это случайная дата на данный момент, поскольку она имеет дубликатзаписей, и это в настоящее время 123 с даты, которая является, откуда .AddDays (-123) приходит.Два запроса возвращают разные результаты, запрос SQL возвращает счет 170, а мой запрос LINQ возвращает только 98.