質問
私は奇妙な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)
}
所属していません StackOverflow