linq子句中的值不能为null

时间:2014-04-29 06:44:53

标签: c# linq expression async-await

我有这个方法:

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.

2 个答案:

答案 0 :(得分:0)

Context.Set可能为null。

另外,请使用同步代码而不是异步执行测试,可能问题在于过早的资源处理。

请提供完整的堆栈跟踪以确定,并解释我们如何使用您的datacontext(获取方法)。

答案 1 :(得分:0)

显然,我欺骗了你们。我最诚挚的道歉。

创建同步版本后,理查德建议我注意到&#39;查询&#39;在该方法中为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>();
}

注意&#39;为DbSet&#39;。这适用于Context.Set但不适用于&#39;。&#39;返回一个IQueryable,我的原因不知道,我不能将其转换为DbSet。 (我认为它继承自IQueryable)。

所以&#39;作为DbSet&#39;使查询为null,从而浪费你所有的时间。

谢谢你放纵我。