Frage

Ich habe eine ungerade Linq subquery Ausgabe.

Da die folgende Datenstruktur:

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

(natürlich ist dies nicht die reale Struktur, aber es ist nah genug für dieses Beispiel)

Ich bin in der Lage, diese Abfrage auszuführen und um ein gewünschtes Ergebnis zu erhalten:

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

Also, wenn es ein Kind ist, dass die Lage „Home“ für einen Elternteil von Id 1 hat, werde ich dieses Kindes „HasFoo“ Wert bekommen, sonst werde ich falsch bekommen, was die „default“ Wert für a bool.

Allerdings, wenn ich versuche, und schreiben Sie die Abfrage, damit ich eine Liste der übergeordneten Objekte haben, etwa so:

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

Ich erhalte die folgende Fehlermeldung, wenn über die Liste iterieren:

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

ich sehe nicht, wo dieser „null“ Wert herkommt, aber.

War es hilfreich?

Lösung

Ich frage mich, ob der Compiler HasHomeChildrenWithFoo Bool sein wird Folgern, aber dann Gießen tatsächlich zu einem Nullable-Bool (also Ihren SingleOrDefault Anruf vermasselt). Auf jeden Fall würde ich bereit sein, Sie es mit einer Besetzung zu einem Nullable Type in den letzten auswählen fixieren wetten könnten, die Sie dann auf false Standard manuell, wenn null. Es wäre wahrscheinlich der Fehler macht weggehen, aber es ist irgendwie eine Brute-Force-Flickschusterei.

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)
                 }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top