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

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

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

Entity Frameworkは、.NET Framework 3.5より追加されたデータアクセス技術。正式名称は「ADO.NET Entity Framework」です。データベースエンジンに依存しておらず、データプロバイダの変更のみで様々なデータベースに対応できます。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

1回答

590閲覧

C# Listの要素の処理方法

NewNiche

総合スコア22

Entity Framework

Entity Frameworkは、.NET Framework 3.5より追加されたデータアクセス技術。正式名称は「ADO.NET Entity Framework」です。データベースエンジンに依存しておらず、データプロバイダの変更のみで様々なデータベースに対応できます。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2022/01/12 14:31

編集2022/01/13 02:35

前提・実現したいこと

https://teratail.com/questions/377011 の続きの質問になります。

以下のようなテーブを考えた際に
テーブルAからシリアル(ここではaaaa)を取得するため、
テーブルBの列;コードを’ー’と’N’で分割したもの と テーブルAの列;年月日を比較して、
合致するテーブルAのデータを取得したいです。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
foreachで4行分回すのではなく、以下の処理を4行分、一気にNewEntityリストに格納することは可能でしょうか。

string[] ymd = List[0].Split(new char[] { '-', 'N' });

var NewEntity =context.テーブルA.AsEnumerable().Where(x => x.Year.Tostring() == ymd[0] && x.Month x.Year.Tostring() == ymd[1] && x.Day x.Year.Tostring() == ymd[2]) .ToList();
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

テーブルA

シリアル
11124aaaa
22175baaa
11124aabb
22175bbbb

テーブルB

コード
11-12N4←テーブルAの1行目と合致
10-3N4
13-12N4
14-3N4

該当のソースコード

C#

1 2 //リストにテーブルBのコードを入れる 3 var List = new List<string>(); 4 テーブルBエンティティ.ForEach(x => { List.Add(x.Code); }); 5 6 7 //Listのcodeを三分割して、テーブルAの年月日と比較する処理 8 string[] ymd = List[0].Split(new char[] { '-', 'N' }); 9 10 var NewEntity = context.テーブルA.AsEnumerable() 11 .Where(x => x.Year.Tostring() == ymd[0] && x.Month x.Year.Tostring() == ymd[1] && x.Day x.Year.Tostring() == ymd[2]) 12 .ToList(); 13 14 15

補足情報(FW/ツールのバージョンなど)

C#
.NET
Entity Framework
SQLServer
VisualStudio2017

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

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

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

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

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

NewNiche

2022/01/13 02:26

対応遅れてしまい、申し訳ございません。。
退会済みユーザー

退会済みユーザー

2022/01/13 03:36 編集

> foreachで4行分回すのではなく、以下の処理を4行分、一気にNewEntityリストに格納することは可能でしょうか。 意味が分かりません。その結果 NewEntity はどうなればいいのですか? それに、foreach を使えば質問者さんが自己解決できるなら、foreach を使えば良いと思いますけど、何故そうしないのですか?
NewNiche

2022/01/13 23:38 編集

for (int i = 0; i < List.Count(); i++) { string[] ymd = List[i].Split(new char[] { '-', 'N' }); var NewEntity = context.テーブルA.AsEnumerable().Where(x => x.Year.Tostring() == ymd[0] && x.Month Tostring() == ymd[1] && x.Day .Tostring() == ymd[2]); } 以上のようなコードを考えたのですが、NewEntityに四列分の処理が入ってこず、NULLになってしまうので、for/foreachを使わない方法を考えておりました。
退会済みユーザー

退会済みユーザー

2022/01/13 06:01

先のコメントの質問「その結果 NewEntity はどうなればいいのですか?」に答えてください。 > NULLになってしまうので、 先のスレッドは解決したそうですが、であればその時は null にはならなかったのでは? そこも意味不明です。変数のスコープという基本的なことは理解してますか?
NewNiche

2022/01/13 23:48 編集

理解が足りておらず、すみません. 前スレっとでは、そこまでは確認しておりませんでした。スコープは理解しているつもりです。。 NewEntityは、結果的にCount=4を格納したいです。
退会済みユーザー

退会済みユーザー

2022/01/14 01:39

話が通じてますか?  > 前スレっとでは、そこまでは確認しておりませんでした。 前のスレッドと言うのは、ここのコメント欄の一番最初に私が書いた https://teratail.com/questions/377606 のことだけど、そのスレッドの私の回答のコメント欄に、質問者さんが > 一時変数を使う方法、AsEnumerableを使う方法、ともに実行できました。 と書いたけど、どういうこと? > スコープは理解しているつもりです。。 いや、理解してたら上の質問者さんの 2022/01/14 08:38 のコメントのようなコードは書かないはず。ホントに分かっているならそういうコードは書かないこと。 > NewEntityは、結果的にCount=4を格納したいです。 私の質問「その結果 NewEntity はどうなればいいのですか?」の答えになってないです。何が 4 つ NewEntity に入っていればいいの?
guest

回答1

0

やりたいことは LinqのSelectMany()なのかと思いますがサンプルデータだと抽出結果は4にならないので違うかもしれません。ymdの方はリスト化する際に文字列からintに変換しています。

var tableA = context.テーブルA.AsEnumerable(); var tableB = context.テーブルB.Select(x=>x.Code).AsEnumerable(); //var tableB = new[] {"11-12N4","10-3N4","13-12N4","14-3N4"}; var ymdList = tableB.Select(l => l.Split('-','N').Select(s => int.Parse(s)).ToList()); var newEntry = ymdList.SelectMany(ymd => tableA.Where(a => a.year == ymd[0] && a.month==ymd[1] && a.day == ymd[2]));

EFとしてはあまりよくないサンプルですが、知りたい部分は
ymdをリスト化し、1つずつ抽出した結果を平坦化(SelectMany)することで得られると思います。

投稿2022/01/14 04:16

編集2022/01/14 04:25
hqf00342

総合スコア273

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問