J'essaie d'exécuter une requête LINQ sur une collection Azure DocumentDB. Quand je lance ma requête, je continue à obtenir un AggregateException
qui contient un InvalidOperationException
avec le message:"L'objet nullable doit avoir une valeur" quand Où utilise une méthode?
objet Nullable doit avoir une valeur
J'ai réduit cette question à ce qui suit (un peu artificiel) par exemple :
Quand je lance ce code, je reçois l'exception mentionnée ci-dessus jeté de l'appel à ToArray()
public class MyDocument { ... }
public void RunQuery()
{
var query = documentDbClient
.CreateDocumentQuery<MyDocument>()
.Where(doc => GetDoc(doc) != null);
var results = query.ToArray()
}
public MyDocument GetDoc(MyDocument myDocument)
{
return myDocument;
}
En revanche, lorsque je lance le code ci-dessous aucune exception n'est levée et je récupère de bons résultats de la collection DocumentDB.
public void RunQuery()
{
var query = documentDbClient
.CreateDocumentQuery<MyDocument>()
.Where(doc => doc != null);
var results = query.ToArray()
}
Pourquoi la différence de comportement entre les deux exemples de code?
Notes:
- Alors que GetDoc()
est une position dans ma logique sous-jacente plus complexe, le code reproduit ci-dessus la question exactement. Je ne retiens pas de manigances à l'intérieur GetDoc()
ou d'autres méthodes :)
- Le problème se produit même lorsque GetDoc()
est faite static
.
- Juste essayé de reproduire avec un List<MyDocument>
au lieu de documentDbClient
et aucune exception n'a été levée. Indique quelque chose dans le fournisseur de données sous-jacent = Azure DocumentDB IDatabaseClient
.
Eh bien, alors votre méthode 'GetDoc' est le problème :). Donc soit vous montrez la méthode, soit nous ne pouvons pas vous aider. – ckruczek
La méthode GetDoc renvoie apparemment un type non nullable. –
Je ne sais pas Azure DocumentDB. Donc, ce n'est peut-être pas une réponse appropriée. Mais avec Entity Framework, ce code va faire une erreur lors de l'exécution car il ne peut pas rappeler BACK dans le code du côté appelant (par exemple votre fonction GetDoc). Je peux voir n'importe quel système comme celui-ci ayant ce type de problème. Peut-être qu'il prend en charge un délégué? par exemple.Func whereClause = (d) => {return d; } "où vous pouvez au moins envelopper votre logique complexe dans un Func réutilisable –