我一直在尋找可能的解決方案,並試圖在幾個小時內沒有運氣。任何幫助將不勝感激。一個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)
};
感謝您的幫助
感謝您的快速回復。由於您提到的原因,我通常喜歡在Sql中放置複雜的查詢。但是,該項目的優先級性能非常低,因此最好將這些邏輯保存在代碼中。我在幾分鐘內把sql代碼放在一起,但是我仍然在學習LINQ,這是我希望能夠解決這個問題的另一個原因...只是爲了學習我自己 – PostureOfLearning 2012-07-09 23:48:36
關於顯示生成的Sql,我提出的C#代碼目前給我這個運行時錯誤:「實體或複雜類型'CPDModel.UserLearning'不能在LINQ to Entities查詢中構建」 – PostureOfLearning 2012-07-09 23:52:25
「我猜'DefaultIfEmpty(new UserLearning(){Score = 0})'部分是原因的錯誤。但即使你只留下一個'DefaultIfEmpty()',它也應該工作,因爲它應該轉換爲左連接和求和,並且sql應該關心它。 – 2012-07-09 23:56:20