实体框架:DbIsNullExpression的参数必须是指在原始或引用类型 [英] Entity Framework: The argument to DbIsNullExpression must refer to a primitive or reference type

查看:1568
本文介绍了实体框架:DbIsNullExpression的参数必须是指在原始或引用类型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图使用实体要做到这一点:

  SELECT * 
从aspnet_UsersùLEFT JOIN( SELECT u.UserId,p.Permission,p.MediaId,p.Valid
从aspnet_UsersüLEFT JOIN权限p于u.UserId = p.UserId
其中p.MediaId = 57和p.Valid = 1
)b
关于u.UserId = B.UserId

下面是C#代码:

  VAR起来=从u在en.aspnet_Users 
在en.Permissions $ b $加入p b。关于u.UserId在pu.DefaultIfEmpty()
等于p.UserId到PU
从P2的地方p2.MediaId == this.MediaId&放大器;&安培; p2.Valid ==真
选择新的
{
u.UserId,
p2.PermissionId,
p2.Permission1,
p2.MediaId,
p2.Valid
};

变种UL从我们这里=以en.aspnet_Users
最多的us.UserId
加入时在pm1.DefaultIfEmpty等于pm.UserId到PM1
从PM2( )
排序依据us.LoweredUserName
选择新PermissionInfo {
=许可(PM2 == NULL -1:pm2.Permission1),
=用户名us.UserName,
用户ID = us.UserId,
PermissionId =(PM2 == NULL -1:pm2.PermissionId)};
RET = ul.ToList();



然而,得到了他的错误在最后一行



要DbIsNullExpression的参数必须是指在原始或引用类型。



任何人知道如何解决这一问题?谢谢



编辑回答1建议:

  VAR起来=从u在en.aspnet_Users 
在en.Permissions
加入p于u.UserId在pu.DefaultIfEmpty()
,其中p2.MediaId等于p.UserId到PU
从P2 == this.MediaId&放大器;&安培; p2.Valid ==真
选择新的{U,P 2};
$ B在en.aspnet_Users
$ B变种UL =从我们这里最多
加入时许us.UserId在PM1等于pm.u.UserId到PM1
从PM2。 DefaultIfEmpty()
排序依据us.LoweredUserName
选择新PermissionInfo
{
=许可(PM2 == NULL -1:pm2.p2.Permission1),
用户名= us.UserName,
用户ID = us.UserId,
PermissionId =(PM2 == NULL -1:pm2.p2.PermissionId?)
};

RET = ul.ToList();


解决方案

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

$ B $在en.aspnet_Users
b

  VAR intermediateUl =从我们这里最多的us.UserId 
加入时等于pm.UserId到pmOuter $ b从PM2 $ b在pmOuter.DefaultIfEmpty()
选择新的{us.UserName,us.UserId,PM2};

变种UL = intermediateUl
.ToList()
。选择(O =>新PermissionInfo {
=许可(o.pm2 == NULL -1 :pm2.Permission1),
PermissionId =(o.pm2 == NULL -1:pm2.PermissionId)
=用户名o.UserName,
用户ID = o.UserId,
});



这个问题让我吃惊的好,因为两行以上,我与外部连接其通过了一项类似的查询好。看来,检查使用LINQ外结构null是只能用实体框架称为实体的可能。其他类,匿名与否,混淆EF / LINQ。



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


I'm trying to use entity to do this:

    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

Here is the C# code:

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

However, got his error at the last line

The argument to DbIsNullExpression must refer to a primitive or reference type.

Anyone knows how to fix this? thanks.

Edit to answer 1 suggestion:

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

解决方案

Had a similar problem, I managed to solve it by moving the null check outside of the sql. In your case you can do it by calling ToList() before checking for 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, 
     });

The problem surprised me as well, because couple lines above I had a similar query with outer join which passed OK. It seems that checking for null with linq outer construct is only possible with entities known by Entity Framework. Any other class, anonymous or not, confuses EF/linq.

I know this question is old, but maybe it will help someone :)

这篇关于实体框架:DbIsNullExpression的参数必须是指在原始或引用类型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆