Как преобразовать приведенную ниже группу sql с помощью оператора в Linq - PullRequest
0 голосов
/ 06 апреля 2011

Я новичок в 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);

Ответы [ 2 ]

0 голосов
/ 07 апреля 2011

Я ВСЕГДА возвращаюсь к 101 образцу LinQ

http://msdn.microsoft.com/en-us/vcsharp/aa336746

0 голосов
/ 06 апреля 2011

Я думаю, что есть несколько способов сделать это, но я сделал нечто похожее и сопоставил его с объектом. Это утверждение не совсем подходит для вашей проблемы, но вы можете использовать приведенное ниже, чтобы смешивать различные значения с совокупными (имеющими, группировать, считать, суммировать) и т. Д.

             IEnumerable<MyObject> myObj                  
              =  (from d in dbContext.DR_Deal          
             /*DO ALL YOUR JOINS */ 
             join ds in dbContext.DR_DealStage on d.statusID equals ds.dealstageID
             where ds.mycolumn == myvalue

             select new MyObject()
             {
                   groupedByObject = d,
                   singleColumnsValue = ds.columnName
                   /* For calculated values have inner LINQ statements which join
                   back to elements from the main query. These can also 
                   return objects*/
                   agregateValue = (from x in dbContext.OtherTable
                                    where x.id == d.id).Count()
             })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...