2012-10-07 36 views
0

我试图使用实体做到这一点:实体框架:DbIsNullExpression的参数必须是指在原始或引用类型

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(); 
+0

感谢您的建议。 它做的是:它有2个表,用户和权限。对于不同媒体ID的用户,权限具有权限值。但它没有列出所有用户的所有媒体ID的权限。我需要为所有用户提供一个列表。如果用户处于权限中,请列出其值。如果用户不在Permission中,则列表为-1。这就是为什么它有两个左连接。 SQL很简单,实体查询也很简单。 再次感谢。 – urlreader

回答

0

我认识到,由于在第二查询时,它仍然有左与aspnet_Users表格内加入,它并不需要具有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(); 
1

有一个类似的问题,我设法通过移动SQL以外的空检查解决它。你的情况,你可以通过检查Null之前调用ToList()做到这一点:

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是唯一可能的实体框架已知的实体。任何其他类别,无论是匿名还是混淆EF/linq。

我知道这个问题是旧的,但也许它会帮助别人:)

相关问题