Domanda

Ho un problema LINQ sottoquery dispari.

Data la seguente struttura dei dati:

Parents            Children
-------            --------
Id                 Id
                   ParentId
                   Location
                   HasFoo

(ovviamente questa non è la vera e propria struttura, ma è abbastanza vicino per questo esempio)

Sono in grado di eseguire questa query e ottenere un risultato desiderato:

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

Quindi, se c'è un bambino che ha la posizione "Home" per un genitore di Id 1, mi metterò valore "HasFoo" di quel bambino, in caso contrario, vado a prendere falsa, che è il valore di "default" per un bool.

Tuttavia, se provo e scrivere la query in modo ho un elenco di oggetti genitore, in questo modo:

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

ottengo il seguente errore quando l'iterazione di lista:

The null value cannot be assigned to a member with type System.Boolean which is a non-nullable value type.

Non vedo dove questo valore "null" sta venendo, però.

È stato utile?

Soluzione

Mi chiedo se il compilatore è inferire HasHomeChildrenWithFoo essere bool, ma poi in realtà lanciare un bool annullabile (scherzi così alla chiamata SingleOrDefault). In ogni caso, sarei pronto a scommettere che potrebbe risolvere il problema con un cast a un tipo nullable in quella finale di selezionare quali si può quindi di default manualmente su false quando null. Sarebbe probabilmente fa l'errore di andare via, ma è una specie di kludge forza bruta.

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)
                 }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top