我一直在寻找可能的解决方案,并试图在几个小时内没有运气。任何帮助将不胜感激。一个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