質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
LINQ

LINQとはLanguage INtegrated Queryの略で、「統合言語クエリ」という意味です。C#やVisual Basicといった言語のコード内に記述することができるクエリです。

Q&A

解決済

1回答

2337閲覧

LINQのSelectManyで平坦化する時に、データにリストをもっていなかったらnullを取得したい

退会済みユーザー

退会済みユーザー

総合スコア0

LINQ

LINQとはLanguage INtegrated Queryの略で、「統合言語クエリ」という意味です。C#やVisual Basicといった言語のコード内に記述することができるクエリです。

0グッド

0クリップ

投稿2021/09/10 09:44

編集2021/09/10 11:44

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}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2021/09/10 10:42

文法ミスが多すぎて、それ以前の問題です。
退会済みユーザー

退会済みユーザー

2021/09/10 11:02 編集

上記はテキストエディタで書いたため、文法がまちがっていればすみませんが、後ほと修正させていただきます。 質問の意味はLINQのSelectManyで平坦化する時に、リストをもっていなかったらnullを取得する方法です。
Zuishin

2021/09/10 11:07

「多すぎて」と書いた通り、その一か所だけではなく、多くのミスがあるので、全て修正してコンパイルが通るのを確認してから掲載するのが良いと思います。
退会済みユーザー

退会済みユーザー

2021/09/10 11:45

大変失礼しました。コードを修正しました。
hihijiji

2021/09/11 02:17

null が入っているコレクションじゃなくて? だったら冗長に書くしかないですよ?
退会済みユーザー

退会済みユーザー

2021/09/11 03:41

nullか0件のデータが返ってくればよいのですが、冗長にというのはforeach等を使うことでしょうか?具体的にはどんな感じでしょうか?
Zuishin

2021/09/11 03:49 編集

bases2 が null になればいいのであれば、DefaultIfEmpty が使えると思います。 逆に SelectMany 中に使っている DefaultIfEmpty は要りません。 Subs が null のものは SelectMany より前に Where を置いて除外すると良いのではないでしょうか。 要するにこういう形です。 bases2 = bases.Where(a => a.Subs != null).SelectMany(/* TODO */).DefaultIfEmpty(); 0 件でいいのであれば、最後の DefaultIfEmpty も要りません。
退会済みユーザー

退会済みユーザー

2021/09/11 04:59 編集

Zuishinさん、ありがとうございます。 いま出先のため検証はできないのですが、おそらくベストアンサーになるかなと思います。 回答欄に書いていただければ、確認後、ベストアンサーにさせていただきたいです。 さきにWhereで除外っていうのはなかなか気づかなかったのと、DefaultEmptyの使い方も間違えていました。 とても勉強になりました。
Zuishin

2021/09/11 05:00

検証して、解決するのであればそのコードで自己解決してください。
退会済みユーザー

退会済みユーザー

2021/09/11 05:01

了解しました、ありがとうございます。
退会済みユーザー

退会済みユーザー

2021/09/11 10:37 編集

教えて頂いた方法がヒントになりましたが、うまくいかなくて、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()の使い方がまだよく理解できていませんが。
guest

回答1

0

ベストアンサー

三項演算子でWhereで絞り込みしたもののチェックをして、リストがなければnullとしました。
もしかしたら、DefaultIfEmpty()はいらないかもしれません。

C#

1var bases3 = bases.Where(e => e.Subs != null).Any() ? 2 bases 3 .Where(e => e.Subs != null) 4 .SelectMany(e => e.Subs, (e, 修正e2) => new { 5 Id = e.Id, SubName = e2.Name 6 }) 7 .DefaultIfEmpty() 8: null;

投稿2021/09/11 10:11

編集2021/09/13 01:11
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問