2014-04-29 55 views
2

空我有这样的方法:值不能在LINQ条款

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方法不断抛出“值不能为空。参数: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

您可以添加堆栈跟踪吗? –

+1

你能解释一下你如何填充'Context.Set ()',因为错误提示'query'为空 – jaywayco

回答

0

Context.Set可能是零。

此外,请使用同步代码而不是异步进行测试,也许问题在于过早的资源配置。

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

0

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

在创建一个同步版本后,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>(); 
} 

注意“作为DbSet”。这适用于Context.Set,但不适用于返回IQueryable的'.Where',这是我未知的原因,不能转换为DbSet。 (我认为它从IQueryable继承)。

因此'as DbSet'使查询为空,从而浪费您所有的时间。

谢谢你放纵我。

+0

你应该把这个标记为答案,所以人们不会试一试。 – i3arnon

+0

刚刚尝试过,但我可以在两天内完成。所以它看起来。 –