ToListAsync 抛出“值不能为空”。例外

Posted

技术标签:

【中文标题】ToListAsync 抛出“值不能为空”。例外【英文标题】:ToListAsync throws 'Value cannot be null.' Exception 【发布时间】:2017-09-16 19:33:54 【问题描述】:

IQueryable

var query = _db
    .ApplicationPaidServices
    .Include(it => it.Application)
    .Include(it => it.Application.User)
    .Where(it => Enum1.Value1 == it.Application.Enum1)
    .Skip(0);                

正在执行1

 var result1 = await (from it in query
                      select it)
            .ToListAsync();

有效。

正在执行2

 var result2 = await (from it in query
                      select
                      new
                       it )
                     .ToListAsync();

抛出ArgumentNullException 并带有消息:值不能为空。参数名称:arguments[2]

堆栈跟踪

System.Dynamic.Utils.ContractUtils.RequiresNotNull(object value, string paramName, int index) System.Dynamic.Utils.ExpressionUtils.RequiresCanRead(表达式表达式,字符串参数名称,int idx) System.Dynamic.Utils.ExpressionUtils.ValidateOneArgument(MethodBase 方法,ExpressionType nodeKind,表达式参数,ParameterInfo pi,字符串 methodParamName,字符串 argumentParamName,int 索引) System.Dynamic.Utils.ExpressionUtils.ValidateArgumentTypes(MethodBase 方法,ExpressionType nodeKind,参考 ReadOnlyCollection 参数,字符串 methodParamName) System.Linq.Expressions.Expression.Call(表达式实例,MethodInfo 方法,IEnumerable 参数) Microsoft.EntityFrameworkCore.Query.ExpressionVisitors.Internal.IncludeExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression) System.Linq.Expressions.MethodCallExpression.Accept(ExpressionVisitor 访问者)

在初始查询中添加 WhereSkip 可修复错误。

不知道是什么原因。

使用 Npgsql.EntityFrameworkCore.PostgreSQL.NET Core 1.1

【问题讨论】:

任何时候看到此类异常,请确保这是当前的 EF Core 错误。 .Skip(0) ? - 跳过零元素有意义吗? community.embarcadero.com/blogs/entry/… @FredrikRedin 此代码取自分页的实际实现,其中Skip函数的参数不是固定数字,而是根据当前页码计算的。 【参考方案1】:

今天被这个咬了。一种可能的解决方法是在Select() 之前等待ToListAsync

        var paged = await queryable
            .OrderBy(m => m.Name)
            .Skip(0).Take(30)
            .ToListAsync();

        var result = paged.Select(ViewModel.Map).ToList();

【讨论】:

好吧,在这种情况下,我们失去了仅从数据库加载对象的一部分而不是整个对象的好处。 确实如此。但是当我写答案时,我使用的是 EF Core 1.x,它无论如何都会检索整个对象。

以上是关于ToListAsync 抛出“值不能为空”。例外的主要内容,如果未能解决你的问题,请参考以下文章

Flutter 的 TextPainter 抛出一个 '!_needsLayout': is not true。例外

为啥在获取 Users.ToListAsync() 不为空时会出现 SqlNullException

“ToListAsync()”和“AsAsyncEnumerable().ToList()”之间的区别

如果我在未定义为任务的 IQueryable 上使用 await + ToListAsync() 是不是正确

为什么调试器会抛出“读取访问冲突。这是nullptr”例外吗?

更新方法 - 值不能为空。 (参数“实体”)