sous-requête linq retour null
-
23-08-2019 - |
Question
J'ai un problème de sous-requête LINQ impair.
Compte tenu de la structure de données suivantes:
Parents Children ------- -------- Id Id ParentId Location HasFoo
(évidemment ce n'est pas la structure réelle, mais il est assez proche pour cet exemple)
Je suis en mesure d'exécuter cette requête et d'obtenir un résultat souhaité:
bool b = (from p in Parents
from c in Children
where p.Id == 1 && c.ParentId == p.Id && c.Location == "Home"
select c.HasFoo).SingleOrDefault();
Donc, s'il y a un enfant qui a l'emplacement « Home » pour un parent de Id 1, je vais obtenir la valeur « HasFoo » de cet enfant, sinon, je vais faux, ce qui est la valeur « par défaut » pour une bool.
Cependant, si j'essayer d'écrire la requête donc j'ai une liste d'objets de parents, comme ceci:
var parentList = from p in Parents
select new ParentObject
{
ParentId = p.ParentId,
HasHomeChildren = p.Children.Count(c => c.Location == "Home") > 0,
HasHomeChildrenWithFoo = (from c in p.Children where c.Location == "Home" select c.HasFoo).SingleOrDefault()
}
Je reçois l'erreur suivante lorsque vous parcourez la liste:
The null value cannot be assigned to a member with type System.Boolean which is a non-nullable value type.
Je ne vois pas où cette valeur « null » vient cependant de,.
La solution
Je me demande si le compilateur infère HasHomeChildrenWithFoo être bool, mais la coulée en fait à un bool annulable (Messing donc votre appel SingleOrDefault). En tout cas, je serais prêt à parier que vous pouvez le fixer avec un casting à un type Nullable dans cette dernière sélection que vous pouvez ensuite manuellement par défaut à false lorsque nulle. Il serait probablement faire l'erreur aller loin, mais il est un peu une bidouille force brute.
var parentList = from p in Parents
select new ParentObject
{
ParentId = p.ParentId,
HasHomeChildren = p.Children.Any(c => c.Location == "Home"),
HasHomeChildrenWithFoo = (from c in p.Children where c.Location == "Home" select (bool?)c.HasFoo) ?? false)
}