使用SUM,Case When,Group by,outer join,aggregate和defaults的C#Linq to Sql查询

时间:2012-07-09 23:16:20

标签: c# sql linq linq-to-sql c#-4.0

我一直在寻找可能的解决方案,并在没有运气的情况下尝试了几个小时。任何帮助将不胜感激。

我有一个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 :(得分: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,因此我们可以更容易地找到差异?