我有这个方法:
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.
答案 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,从而浪费你所有的时间。
谢谢你放纵我。