【问题标题】:When called from 'VisitLambda', rewriting a node of type 'System.Linq.Expressions.ParameterExpression' must return a non-null value从“VisitLambda”调用时,重写“System.Linq.Expressions.ParameterExpression”类型的节点必须返回非空值
【发布时间】:2020-04-27 04:12:48
【问题描述】:

我有 4 张桌子。

1 - 用户 2 - 用户角色 3 - 角色 4 - 访问级别

我需要的是,当用户登录应用程序时,访问级别列表将发送给它。

我正在使用以下代码:

                var userInfo = await Users.Where(x => x.Id == id)
                 .Select(x => new
                 {
                     UserDusplayName = x.Name + x.Family,
                     AccessLevel = x.UserRoles.FirstOrDefault().Role.AccessLevels.ToList()
                 })
                 .Select(v=>new UserInformationDto
                 {
                     DispayName=v.UserDusplayName,
                     AccessUnserInfos=v.AccessLevel.Select(x=>x.Access)
                 }).FirstOrDefaultAsync();

在我的数据库中,这个 id 有一个 AccessLevel 。

但是,当我向 this 发送请求时,它会显示以下内容:

从“VisitLambda”调用时,重写“System.Linq.Expressions.ParameterExpression”类型的节点必须返回相同类型的非空值。或者,覆盖 'VisitLambda' 并将其更改为不访问此类子项

我的代码有什么问题?我该如何解决这个问题??

【问题讨论】:

    标签: c# asp.net entity-framework asp.net-core entity-framework-core


    【解决方案1】:

    我的代码有什么问题?

    从技术上讲,问题不在于您的代码是有效的 LINQ 查询,而是 EF Core 查询翻译器的错误/缺点。

    这里有两个构造

    AccessLevel = x.UserRoles.FirstOrDefault().Role.AccessLevels.ToList()
    

    这会导致 EF Core 翻译器出现问题。

    首先是ToList() 电话。虽然最终预测 (Select) 支持它,但它会导致进一步的查询运算符出现问题,例如下一个 Select 部分

    v.AccessLevel.Select(x=>x.Access)
    

    这里是FirstOrDefault()

    x.UserRoles.FirstOrDefault().Role.AccessLevels
    

    即将序列转换为单个项目,然后从中获取子序列。

    我该如何解决这个问题?

    首先,删除ToList() 或删除中间的Select。其次,删除FirstOrDefault()——它没有任何意义,或者如果真的需要,将其替换为等效的集合限制运算符Take(1)。使用集合展平运算符SelectMany 得到所需的子集。

    例如

    AccessLevel = x.UserRoles.SelectMany(ur => ur.Role.AccessLevels)
    

    应该解决当前的问题。


    不相关,但由于在您的模型中用户有很多角色,并且角色有很多访问级别,这里

    AccessUnserInfos = v.AccessLevel.Select(x => x.Access)
    

    你可以得到重复的值,所以考虑应用Distinct操作符

    AccessUnserInfos = v.AccessLevel.Select(x => x.Access).Distinct()
    

    【讨论】:

      猜你喜欢
      • 2020-04-28
      • 1970-01-01
      • 2021-09-02
      • 1970-01-01
      • 1970-01-01
      • 2020-12-29
      • 2021-05-02
      • 2017-04-22
      • 2018-07-24
      相关资源
      最近更新 更多