Я новичок в LINQ и пытался преобразовать приведенный ниже TSQL в LINQ. Можно ли это как-нибудь сделать? Спасибо за помощь.
Это оператор SQL, который я пытаюсь преобразовать
SELECT [t5].[StatusID], [t5].[FriendlyName], sum(1) AS [Count]
FROM (
SELECT distinct [t0].DealID, [t0].[StatusID], [t1].[FriendlyName]
FROM [DR_Deal] AS [t0]
INNER JOIN [DR_DealStage] AS [t1] ON [t0].[StatusID] = [t1].[DealStageID]
INNER JOIN [DR_Deal_ApproverInfo] AS [t2] ON [t0].[DealID] = [t2].[DealID]
INNER JOIN [DR_Approver] AS [t3] ON [t2].[ApproverID] = ([t3].[ApproverID])
INNER JOIN [DR_Profile] AS [t4] ON [t3].[ProfileID] = ([t4].[ProfileID])
WHERE (LOWER([t4].[Email]) = @p0) OR (LOWER([t0].[CreatedBy]) = @p1)
) AS [t5]
GROUP BY [StatusID], [FriendlyName]
ORDER BY [t5].[StatusID]
EDITS
да вышеупомянутый sql генерируется с использованием linqpad, это то, что я действительно хочу преобразовать в linq
SELECT COUNT(DISTINCT [t0].DealID) AS count, [t0].[StatusID], [t1].[FriendlyName]<br>
FROM [DR_Deal] AS [t0]<br>
INNER JOIN [DR_DealStage] AS [t1] ON [t0].[StatusID] = [t1].[DealStageID]<br>
INNER JOIN [DR_Deal_ApproverInfo] AS [t2] ON [t0].[DealID] = [t2].[DealID]<br>
INNER JOIN [DR_Approver] AS [t3] ON [t2].[ApproverID] = ([t3].[ApproverID])<br>
INNER JOIN [DR_Profile] AS [t4] ON [t3].[ProfileID] = ([t4].[ProfileID])<br>
WHERE (LOWER([t4].[Email]) = LOWER(@Email)) OR (LOWER([t0].[CreatedBy]) = LOWER(@UserName))<br>
GROUP BY [t0].[StatusID], [t1].[FriendlyName]<br>
ORDER BY [t0].[StatusID]
И я думаю, что нашел решение сделать count(distinct)
с использованием linq, на который я изначально наткнулся, но все же преобразованное решение не сработало, я думаю, что приведенный ниже код linq не работает, потому что я использую sql 2000 и сгенерированный sql имеет вложенные селекторы, и кажется, что с SQL 2000 есть некоторое ограничение. Я все еще не уверен в своих выводах, может быть, linq blelow неверен или может быть лучший способ написать выше SQL.
var query = (from d in DR_Deal
join s in DR_DealStage
on d.StatusID equals s.DealStageID
join da in DR_Deal_ApproverInfo
on d.DealID equals da.DealID
join a in DR_Approver
on da.ApproverID equals a.ApproverID
join p in DR_Profile
on a.ProfileID equals p.ProfileID
where p.Email.ToLower().Equals("test@test.com")
|| d.CreatedBy.ToLower().Equals("test")
group d.DealID by new { d.StatusID, s.FriendlyName}
into grp
select new
{
StatusID = grp.Key.StatusID,
FriendlyName = grp.Key.FriendlyName,
Count = grp.Distinct().Count()
}).OrderBy(x=> x.StatusID);