質問

私は奇妙なLINQのサブクエリの問題を持っています。

次のようなデータ構造が与えられます:

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

(もちろん、これは本当の構造ではないが、それはこの例のために十分に近いです)

私はこのクエリを実行し、望ましい結果を得ることができるよ。

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();
IDが1の親のための場所「ホーム」を持っている子があれば、私はその子の「HasFoo」の値を取得しますので、

、そうでない場合は、私が「デフォルト」の値がためである、偽取得しますBOOLます。

しかし、私は試してみて、私はそうのように、親オブジェクトのリストを持っているので、クエリを記述する場合:

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()
                 }
リストの繰り返し処理を行う場合、

私は次のエラーを取得する:

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

私はしかし、この「ヌル」値がどこから来ているが表示されません。

役に立ちましたか?

解決

コンパイラはブール値になるようにHasHomeChildrenWithFooを推測するが、その後、実際に(そのため、あなたのSingleOrDefaultコールをめちゃくちゃ)、NULL可能ブール値にキャストされている場合、私は疑問に思います。いずれにせよ、私はあなたがたときにnullを使用すると、その後、手動でfalseにデフォルトすることができますかを選択その決勝でNULL可能な型にキャストして、それを修正することができるに違いないことをいとわないだろう。それはおそらく、エラーが離れて行く作ると思いますが、それはブルートフォースその場しのぎのようなものだ。

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)
                 }
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top