Pergunta

Eu tenho um problema LINQ subquery estranho.

Dada a seguinte estrutura de dados:

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

(obviamente, esta não é a estrutura real, mas é perto o suficiente para este exemplo)

Eu sou capaz de executar essa consulta e obter um resultado desejado:

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

Portanto, se há uma criança que tem o Local "Home" para um pai de ID 1, vou receber esse valor "HasFoo" da criança, caso contrário, eu vou pegar falsa, que é o valor "default" para uma bool.

No entanto, se eu tentar escrever a consulta para que eu tenho uma lista de objetos pai, assim:

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

Eu recebo o seguinte erro quando iteração sobre a lista:

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

Eu não ver onde este valor "null" está vindo, no entanto.

Foi útil?

Solução

Gostaria de saber se o compilador está inferindo HasHomeChildrenWithFoo ser bool, mas, em seguida, na verdade, lançando a um bool anulável (assim, estragar a sua chamada SingleOrDefault). De qualquer forma, eu estaria disposto a apostar que você pode corrigi-lo com um elenco para um tipo anulável nesse seleto final que você pode então padrão manualmente para false quando nulo. Ele provavelmente faria o erro ir embora, mas é uma espécie de um truque de força 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top