linq subquery ritorni null
-
23-08-2019 - |
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ò.
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)
}