linq子句中的值不能为null
本文关键字:不能 null 子句 linq | 更新日期: 2023-09-27 18:00:34
我有这个方法:
protected async Task<List<T>> Get<T>(Expression<Func<T, bool>> select) where T : class, IEntity
{
var query = Context.Set<T>();
query = query.Where(select);
return await query.ToListAsync<T>();
}
我这样称呼它:
var result = await Get<T>(a => a.Id == myId);
但是Get方法一直抛出"Value不能为null"。参数:source'。
我错过了什么?
更新1:StackTrace:
at System.Data.Entity.Utilities.Check.NotNull[T](T value, String parameterName)
at System.Data.Entity.QueryableExtensions.ToListAsync[TSource](IQueryable'1 source)
at SoccerPool.MVC5.Models.Config.BaseApiController.<Get>d__49'1.MoveNext() in c:'Projects'SoccerPool'SoccerPool.MVC5'Models'Config'BaseApiController.cs:line 190
更新2:Context.Set<T>() is not null. It contains 48 records if I don't perform the linq query. And 'Context' is a property which returns an instance of my DbContext.
Context.Set可能为null。
此外,请使用同步代码而不是异步代码进行测试,可能问题在于资源处置过早。
请提供完整的stacktrace来确定,并向我们解释您的数据上下文(get方法)是如何工作的。
在创建了Richard建议的同步版本后,我注意到该方法中的"query"为null。所以这个例外是有道理的。
在试图澄清SO的代码时,我删除了以下内容(以及其他内容):
protected async Task<List<T>> Get<T>(
Expression<Func<T, bool>> select) where T : class, IEntity
{
var query = Context.Set<T>() as DbSet<T>;
query = query.Where(select) as DbSet<T>;
return await query.ToListAsync<T>();
}
请注意"as DbSet"。这对Context.Set很好,但对返回IQueryable的'.Where'却不好,因为我不知道原因,它不能转换为DbSet。(我认为它继承了IQueryable)。
因此,"as DbSet"使查询为null,从而浪费了您所有的时间。
不管怎样,谢谢你纵容我。