LINQ subconsulta volver nula
-
23-08-2019 - |
Pregunta
Tengo un problema LINQ subconsulta extraño.
Dada la siguiente estructura de datos:
Parents Children ------- -------- Id Id ParentId Location HasFoo
(obviamente esto no es la estructura real, pero es lo suficientemente cerca para este ejemplo)
Soy capaz de ejecutar esta consulta y obtener un resultado deseado:
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();
Así que si hay un niño que tiene la ubicación "Inicio" uno de los padres de ID 1, voy a obtener el valor "HasFoo" de ese niño, de lo contrario, voy a conseguir falsa, que es el valor "default" para una bool.
Sin embargo, si lo intento y escribir la consulta, así que tengo una lista de objetos padres, así:
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()
}
Me sale el siguiente error cuando se itera sobre la lista:
The null value cannot be assigned to a member with type System.Boolean which is a non-nullable value type.
No veo que este valor "nulo" está viniendo, sin embargo.
Solución
Me pregunto si el compilador está infiriendo HasHomeChildrenWithFoo ser bool, pero luego en realidad fundición a un bool anulable (ensuciar tanto su llamada SingleOrDefault). En cualquier caso, estaría dispuesto a apostar que podría solucionarlo con un reparto a un tipo anulable en esa final selecciona que luego se puede defecto manualmente a falso cuando nulo. Probablemente haría que el error desaparezca, pero es una especie de chapuza de fuerza 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)
}