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,.

Était-ce utile?

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)
                 }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top