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 访问者)
在初始查询中添加 Where
或 Skip
可修复错误。
不知道是什么原因。
使用 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() 是不是正确