0

私は可能な解決策を探していて、これを数時間試してみましたが、うまくいきませんでした。どんな助けでも大歓迎です。

C# LINQ クエリとしてまとめようとしている Sql ステートメントがあります。

作業中の 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

さらに何度か試行し、Google をさらに使用した後、最終的に機能するソリューションを取得することができました。それが他の誰かに役立つことを願っています。

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 に答える