2012-07-09 162 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