0

これを行うためにエンティティを使用しようとしています:

    SELECT *
    FROM aspnet_Users u LEFT JOIN (SELECT u.UserId, p.Permission, p.MediaId, p.Valid
                         FROM aspnet_Users u LEFT JOIN Permission p ON u.UserId = p.UserId
                         WHERE p.MediaId = 57 AND p.Valid = 1
                         ) B 
                         ON u.UserId = B.UserId

C# コードは次のとおりです。

    var up = from u in en.aspnet_Users
        join p in en.Permissions
         on u.UserId equals p.UserId into pu
        from p2 in pu.DefaultIfEmpty()
        where p2.MediaId == this.MediaId && p2.Valid == true
        select new
        {
         u.UserId,
         p2.PermissionId,
         p2.Permission1,
         p2.MediaId,
         p2.Valid
        };

    var ul = from us in en.aspnet_Users
       join pm in up
            on us.UserId equals pm.UserId into pm1
       from pm2 in pm1.DefaultIfEmpty()
       orderby us.LoweredUserName
       select new PermissionInfo { 
           Permission = (pm2 == null ? -1 : pm2.Permission1), 
           UserName = us.UserName, 
           UserId = us.UserId, 
           PermissionId = (pm2 == null ? -1 : pm2.PermissionId) };
    ret = ul.ToList();

ただし、最後の行でエラーが発生しました

DbIsNullExpression への引数は、プリミティブ型または参照型を参照する必要があります。

誰でもこれを修正する方法を知っていますか? ありがとう。

編集して1つの提案に答える:

    var up = from u in en.aspnet_Users
                     join p in en.Permissions
                         on u.UserId equals p.UserId into pu
                     from p2 in pu.DefaultIfEmpty()
                     where p2.MediaId == this.MediaId && p2.Valid == true
                     select new {u, p2};

            var ul = from us in en.aspnet_Users
                     join pm in up
                          on us.UserId equals pm.u.UserId into pm1
                     from pm2 in pm1.DefaultIfEmpty()
                     orderby us.LoweredUserName
                     select new PermissionInfo
                     {
                         Permission = (pm2 == null ? -1 : pm2.p2.Permission1),
                         UserName = us.UserName,
                         UserId = us.UserId,
                         PermissionId = (pm2 == null ? -1 : pm2.p2.PermissionId)
                     };

            ret = ul.ToList();
4

2 に答える 2

2

同様の問題がありましたが、null チェックを SQL の外に移動することで解決できました。あなたの場合、ToList()チェックする前に呼び出すことでそれを行うことができますNull

var intermediateUl = from us in en.aspnet_Users
    join pm in up
      on us.UserId equals pm.UserId into pmOuter
    from pm2 in pmOuter.DefaultIfEmpty()
    select new { us.UserName, us.UserId, pm2};

var ul = intermediateUl
    .ToList()
    .Select(o => new PermissionInfo { 
        Permission = (o.pm2 == null ? -1 : pm2.Permission1), 
        PermissionId = (o.pm2 == null ? -1 : pm2.PermissionId) 
        UserName = o.UserName, 
        UserId = o.UserId, 
     });

上記の数行で、外部結合を使用した同様のクエリがあり、OK が渡されたため、この問題には私も驚きました。linq 外部構造での null のチェックは、Entity Framework で認識されているエンティティでのみ可能であるようです。匿名であろうとなかろうと、他のクラスは EF/linq を混乱させます。

私はこの質問が古いことを知っていますが、多分それは誰かを助けるでしょう:)

于 2014-01-17T14:52:31.573 に答える
0

2 番目のクエリではまだ aspnet_Users テーブルとの左結合があるため、1 番目のクエリで u を使用する必要がないので、以下に変更しました。現在は機能しています。それでも、元のコードと提案されたコードが失敗した理由を知ることは素晴らしいことです。

    var up = from u in en.aspnet_Users
                     join p in en.Permissions
                         on u.UserId equals p.UserId into pu
                     from p2 in pu.DefaultIfEmpty()
                     where p2.MediaId == this.MediaId && p2.Valid == true
                     select p2;

            var ul = from us in en.aspnet_Users
                     join pm in up
                          on us.UserId equals pm.UserId into pm1
                     from pm2 in pm1.DefaultIfEmpty()
                     orderby us.LoweredUserName
                     select new PermissionInfo
                     {
                         Permission = (pm2 == null ? -1 : pm2.Permission1),
                         UserName = us.UserName,
                         UserId = us.UserId,
                         PermissionId = (pm2 == null ? -1 : pm2.PermissionId)
                     };

            ret = ul.ToList();
于 2012-10-08T15:03:37.937 に答える