2014-04-29 5 views
2

J'ai cette méthode:valeur ne peut pas être nulle dans la clause 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>(); 
} 

Et je l'appelle comme ceci:

var result = await Get<T>(a => a.Id == myId); 

Mais la méthode Get continue de lancer « La valeur ne peut être nulle. Paramètre: source '.

Qu'est-ce qui me manque?

Mise à jour 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

Mise à jour 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

Pourriez-vous ajouter la trace de la pile? –

+1

Pouvez-vous expliquer comment vous peupler 'Context.Set ()' parce que l'erreur suggère que 'query' est nul – jaywayco

Répondre

0

Context.Set est probablement nulle.

En outre, s'il vous plaît faire un test avec un code synchrone plutôt que asynchrone, peut-être le problème est dans l'élimination prématurée des ressources.

Veuillez fournir une pile complète pour être sûr, et expliquez-nous comment fonctionne votre datacontext (méthode Get).

0

Je vous ai joué un tour, apparemment. Mes excuses les plus sincères. Après avoir créé une version de synchronisation que Richard a suggéré, j'ai remarqué que 'query' dans cette méthode était null. Donc l'exception avait du sens.

En essayant de clarifier le code pour le SO j'ai supprimé les éléments suivants (entre autres choses):

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>(); 
} 

Notez que le 'comme DbSet'. Cela a bien fonctionné pour le Context.Set mais pas pour le '.Where' qui renvoie un IQueryable qui, mes raisons inconnues à moi, ne peut pas être converti en un DbSet. (J'ai pensé qu'il a hérité de IQueryable). Ainsi, le 'as DbSet' rend la requête nulle et perd ainsi tout votre temps.

Merci de m'avoir fait plaisir de toute façon.

+0

Vous devriez marquer ceci comme la réponse, donc les gens ne vont pas essayer. – i3arnon

+0

Juste essayé, mais je peux le faire dans deux jours. Il semble donc. –

Questions connexes