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)
     };

感谢您的任何帮助

4

2 回答 2

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)
    });
于 2012-07-15T20:01:15.100 回答
0

不是您要求的,但是如果您有一个工作复杂的 SQL 查询,它是相当静态的,请将其放入存储过程中,然后将该 SP 拖到您的 LINQ DataContext 中。

LINQ 提供程序必须在每次调用时将查询编译为 sql,这需要时间和服务器 CPU 周期。如果它是一个复杂的查询,它可能会占用大量资源。也可能会错过一些可以使用直接 SQL 进行的优化。

除非当然有它的目的。

如果您有 ORM 问题,请掌握实际的 SQL 命令,查看它,并与您想要实现的结果进行比较。您能否也显示生成的 SQL,以便我们更容易找到差异?

于 2012-07-09T23:36:34.347 回答