2012-07-09 159 views
0

我一直在尋找可能的解決方案,並試圖在幾個小時內沒有運氣。任何幫助將不勝感激。一個C#Linq to Sql查詢使用SUM,Case When,Group by,outer join,aggregate和default

我有一個Sql語句,我試圖把C#LINQ查詢放在一起。

這裏是工作的SQL:

SELECT up.UserProfileID 
    ,up.FirstName 
    ,up.LastName 
    ,SUM(CASE WHEN ul.CompletionDate IS NULL THEN 0 
     ELSE ISNULL(ul.Score, 0) 
    END) AS TotalScore 
FROM dbo.UserProfile up 
    LEFT OUTER JOIN dbo.UserLearning ul ON up.UserProfileID = ul.UserProfileID 
WHERE up.ManagerUserProfileID IS NULL 
GROUP BY up.UserProfileID, up.FirstName, up.LastName 

我試過幾種不同的方式,但似乎結束了無論是語句不返回我想要的東西,或者不執行成功

我現在的(非工作)的代碼看起來是這樣的:

var pd = from up in db.UserProfiles 
    join ul in db.UserLearnings on up.UserProfileID equals ul.UserProfileID into temp 
    from upJOINul in temp.DefaultIfEmpty(new UserLearning() { Score = 0 }) 

    where up.ManagerUserProfileID.Equals(null) 

    group up by new 
    { 
     UserProfileID = up.UserProfileID, 
     FirstName = up.FirstName, 
     LastName = up.LastName, 
     TotalScore = up.UserLearnings.Sum(u => u.Score) 
    }; 

感謝您的幫助

回答

2

經過幾次嘗試和谷歌的進一步使用,我終於設法得到一個工作解決方案。我希望這會對其他人有用。

​​
0

不是你所要求的,但是如果你有一個工作複雜的SQL查詢,那是相當靜態的,把它放在一個存儲過程中,然後把這個SP拖到你的LINQ DataContext中。

LINQ提供程序必須在每次調用時將查詢編譯爲sql,這需要時間和服務器CPU週期。如果這是一個複雜的查詢,它可能會吃掉大量的資源。也可能會錯過使用直接SQL可以完成的一些優化。

除非它有目的。

如果您有ORM問題,請抓緊實際的SQL命令,查看它並與您想要實現的內容進行比較。你能不能顯示生成的SQL,所以我們可以更容易地找到差異?

+0

感謝您的快速回復。由於您提到的原因,我通常喜歡在Sql中放置複雜的查詢。但是,該項目的優先級性能非常低,因此最好將這些邏輯保存在代碼中。我在幾分鐘內把sql代碼放在一起,但是我仍然在學習LINQ,這是我希望能夠解決這個問題的另一個原因...只是爲了學習我自己 – PostureOfLearning 2012-07-09 23:48:36

+0

關於顯示生成的Sql,我提出的C#代碼目前給我這個運行時錯誤:「實體或複雜類型'CPDModel.UserLearning'不能在LINQ to Entities查詢中構建」 – PostureOfLearning 2012-07-09 23:52:25

+0

「我猜'DefaultIfEmpty(new UserLearning(){Score = 0})'部分是原因的錯誤。但即使你只留下一個'DefaultIfEmpty()',它也應該工作,因爲它應該轉換爲左連接和求和,並且sql應該關心它。 – 2012-07-09 23:56:20