LINQのSelectManyで平坦化する時に、リストをもっていなかったらnullを取得したい、
Baseのデータがそのまま返ってきてしまい困っています。(2件のデータがでてきてしまう。)
どなたかご教授お願いします。
9/10 20:42 コード修正しました。
C#
1using System.Collections.Generic; 2using System.Linq; 3 4public class Base { 5 public long Id { get; set; } 6 public string Name { get; set; } 7 8 public virtual IList<Sub> Subs { get; set; } 9} 10 11public class Sub { 12 public long Id { get; set; } 13 public string Name { get; set; } 14 public long BaseId { get; set; } 15 16 public virtual Base Base { get; set; } 17} 18 19public class Test { 20 public static void Main() { 21 IList<Base> bases = new List<Base>() { 22 new Base() { Id = 1, Name = "a", Subs = null }, 23 new Base() { Id = 2, Name = "b", Subs = null } 24 }; 25 26 // 平坦化するデータがない時はnullを返したい。 27 var bases2 = bases 28 .SelectMany(e => e.Subs.DefaultIfEmpty(), (e, e2) => e.Subs != null ? new { 29 Id = e.Id, 30 SubName = e2.Name 31 } : null); 32 } 33}
文法ミスが多すぎて、それ以前の問題です。
上記はテキストエディタで書いたため、文法がまちがっていればすみませんが、後ほと修正させていただきます。
質問の意味はLINQのSelectManyで平坦化する時に、リストをもっていなかったらnullを取得する方法です。
「多すぎて」と書いた通り、その一か所だけではなく、多くのミスがあるので、全て修正してコンパイルが通るのを確認してから掲載するのが良いと思います。
大変失礼しました。コードを修正しました。
null が入っているコレクションじゃなくて?
だったら冗長に書くしかないですよ?
nullか0件のデータが返ってくればよいのですが、冗長にというのはforeach等を使うことでしょうか?具体的にはどんな感じでしょうか?
bases2 が null になればいいのであれば、DefaultIfEmpty が使えると思います。
逆に SelectMany 中に使っている DefaultIfEmpty は要りません。
Subs が null のものは SelectMany より前に Where を置いて除外すると良いのではないでしょうか。
要するにこういう形です。
bases2 = bases.Where(a => a.Subs != null).SelectMany(/* TODO */).DefaultIfEmpty();
0 件でいいのであれば、最後の DefaultIfEmpty も要りません。
Zuishinさん、ありがとうございます。
いま出先のため検証はできないのですが、おそらくベストアンサーになるかなと思います。
回答欄に書いていただければ、確認後、ベストアンサーにさせていただきたいです。
さきにWhereで除外っていうのはなかなか気づかなかったのと、DefaultEmptyの使い方も間違えていました。
とても勉強になりました。
検証して、解決するのであればそのコードで自己解決してください。
了解しました、ありがとうございます。
教えて頂いた方法がヒントになりましたが、うまくいかなくて、1件のnullになってしまいましたので、
var bases2 = bases.Where(e => e.Subs != null)
.SelectMany(e => e.Subs, (e, e2) => new {
Id = e.Id, SubName = e2.Name
}).DefaultIfEmpty();
三項演算子でWhereで絞り込みしたもののチェックをして、リストがなければnullとしました。
var bases3 = bases.Where(e => e.Subs != null).Any() ?
bases.Where(e => e.Subs != null)
.SelectMany(e => e.Subs, (e, e2) => new {
Id = e.Id, SubName = e2.Name
}). DefaultIfEmpty() : null;
三項演算子を使ってチェックしたので、DefaultIfEmpty()がいらないような気がしましたが、DefaultEmpty()の使い方がまだよく理解できていませんが。
回答1件
あなたの回答
tips
プレビュー