我一直在寻找可能的解决方案,并在没有运气的情况下尝试了几个小时。任何帮助将不胜感激。
我有一个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)
};
感谢您的帮助
答案 0 :(得分:2)
经过几次尝试并进一步使用谷歌后,我终于设法找到了一个有效的解决方案。我希望它对其他人有用。
var pd = db.UserProfiles.AsEnumerable()
.Where(up => up.ManagerUserProfileID.Equals(null))
.Select(up => new
{
UserProfileID = up.UserProfileID,
FirstName = up.FirstName,
LastName = up.LastName,
TotalScore = up.UserLearnings
.Where(ul => ul.CompletionDate.HasValue && ul.Score.HasValue)
.DefaultIfEmpty()
.Sum(ul => ul != null && ul.Score.HasValue ? ul.Score : 0)
});
答案 1 :(得分:0)
不是你要求的,但如果你有一个复杂的SQL查询,那就是相当静态的,把它放在一个存储过程中,然后把那个SP拖到LINQ DataContext上。
LINQ提供程序必须在每次调用时将查询编译为sql,这需要时间和服务器CPU周期。如果它是一个复杂的查询,它可能会占用大量资源。也可能会错过一些可以用直接SQL做的优化。
除非当然有目的。
如果您遇到ORM问题,请抓取实际的SQL命令,查看它,然后与您想要实现的内容进行比较。您是否也可以显示生成的SQL,因此我们可以更容易地找到差异?