2011-04-06 139 views
0

我是LINQ的新手,並試圖將下面的TSQL轉換爲LINQ,有沒有什麼辦法可以做到這一點?感謝所有的幫助。如何將以下sql組通過語句轉換爲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

是使用linqpad產生上面的SQL,這是我真正想要轉換到LINQ SELECT COUNT(DISTINCT [t0].DealID) AS count, [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]) = LOWER(@Email)) OR (LOWER([t0].[CreatedBy]) = LOWER(@UserName))
GROUP BY [t0].[StatusID], [t1].[FriendlyName]
ORDER BY [t0].[StatusID]

我想我找到了解決方案來做count(distinct)使用linq,我最初偶然發現,但仍然轉換的解決方案沒有工作,我想下面的LINQ代碼不工作,因爲我使用SQL 2000和生成的SQL有嵌套的選擇,似乎有一些限制sql 2000.我仍然不確定我的結論,可能是linq blelow是錯誤的altogther,或者可能有更好的方法來編寫上述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("[email protected]") 
|| 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); 
+0

對我來說,你提交的t-sql似乎是linq-to-sql提供程序生成的sql。你遇到的確切問題是什麼? – 2011-04-06 13:41:09

+0

我發現學習LINQ的一個有用的工具是** LinqPAD **你可以在這裏找到它[www.linqpad.net/) – tobias86 2011-04-06 13:42:38

+0

@nasmifive:我同意,這看起來非常就像Linq-to-Sql生成的T-Sql一樣 – tobias86 2011-04-06 13:43:37

回答

0

我認爲有許多方法可以做到這一點,但我做了一些事情相似,它映射到一個對象。這種說法是不是你的問題,完全正確的,但你可以使用下面不同的值與agregate(具有組,計數,總和)值等

   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() 
      })