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.

linq子句中的值不能为null

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,从而浪费了您所有的时间。

不管怎样,谢谢你纵容我。