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.

¿Fue útil?

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)
                 }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top