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

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

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

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

Q&A

解決済

2回答

2910閲覧

C# DataTableのRelationsで複数列で結合したい

KishikawaHideto

総合スコア15

C#

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

0グッド

0クリップ

投稿2022/06/18 08:18

C#のDataTableが2つあって、複数列で結合しようとしています。
DataTable1つ目:
dt1 列A,B,C
2つ目
dt2 列A,B,D

リレーションを、
ds.Relations.Add("Gaibu",new DataColumn() {dt1.columns["A"],dt1.columns["B"]}
{dt2.columns["A"],dt2.columns["B"]) , false};

と行うと、
System.Collections.IEnumerableを実装していないため、型System.Data.DataColumnはコレクション初期化子で初期化することはできません。
のエラーが出てしまいます。

何が原因でしょうか。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2022/06/18 08:23

開発環境を書いてください。そもそも何がしたいのかも書いてください(手段だけではなく目的も)。
KishikawaHideto

2022/06/18 08:45

開発環境はWindows Server 2012です。私のPCがMacなのでRemoteDesktopで開発しています。 目的は、2つのCSVファイルを結合してSQLのLEFT OUTER JOINのように1つのテーブルにして、加工をすることです。よろしくお願いいたします。
KishikawaHideto

2022/06/18 09:00

失礼しました。追記です。 Visual Studio 2013,.NET Framework 4.5 です。
退会済みユーザー

退会済みユーザー

2022/06/18 09:01

> 開発環境はWindows Server 2012です。私のPCがMacなのでRemoteDesktopで開発しています。 そうするとどういうことになるのでしょうか? 普通に Windows OS 用の Visual Studio 2020 とかを使って、.NET Framework のアプリを作るのと同じなのですか? そこが知りたいところなのです。 > 2つのCSVファイルを結合してSQLのLEFT OUTER JOINのように1つのテーブルにして、加工をすることです。よろしくお願いいたします。 その目的に「DataTableのRelationsで複数列で結合」は必要ないです。Linq を使って結合できます。 さらに、DataSet/DataTable を作る必要もないです。 結合した結果何を作りたいのですか? CSV ファイル? DataTable?
退会済みユーザー

退会済みユーザー

2022/06/18 09:05 編集

> Visual Studio 2013,.NET Framework 4.5 です。 レスが前後してしまいました。それを質問欄を編集して追記してください。ここは「質問への追記・修正の依頼」を行う場所ですので。
guest

回答2

0

2つのCSVファイルを結合してSQLのLEFT OUTER JOINのように1つのテーブルにして、加工をすることです。よろしくお願いいたします。

その目的に「DataTableのRelationsで複数列で結合」は必要ないです。Linq を使って結合できます。DataSet/DataTable を作る必要もないですが、すでに CSV ファイルから DataTable を作成済みであれば、そこから始めても良いです。

例えば、作成済みの DataTable が以下のコードの table1, Table2 のようになっているとすると、Linq を使って左外部結合できます。

C#

1using System; 2using System.Linq; 3using System.Data; 4 5namespace ConsoleAppLinq 6{ 7 internal class Program 8 { 9 static void Main(string[] args) 10 { 11 var table1 = new DataTable(); 12 table1.Columns.Add(new DataColumn("A", typeof(int))); 13 table1.Columns.Add(new DataColumn("B", typeof(int))); 14 table1.Columns.Add(new DataColumn("C", typeof(string))); 15 for (int i = 0; i < 5; i++) 16 { 17 var row = table1.NewRow(); 18 row["A"] = i; 19 row["B"] = i * 2; 20 row["C"] = i.ToString(); 21 table1.Rows.Add(row); 22 } 23 foreach (DataRow row in table1.Rows) 24 { 25 Console.WriteLine($"A: {row["A"]}, B: {row["B"]}, C: {row["C"]}"); 26 } 27 Console.WriteLine("-------------------------"); 28 29 var table2 = new DataTable(); 30 table2.Columns.Add(new DataColumn("A", typeof(int))); 31 table2.Columns.Add(new DataColumn("B", typeof(int))); 32 table2.Columns.Add(new DataColumn("D", typeof(string))); 33 for (int i = 0; i < 5; i++) 34 { 35 var row = table2.NewRow(); 36 row["A"] = i + 2; 37 row["B"] = (i + 2) * 2; 38 row["D"] = ((i + 2) * 10).ToString(); 39 table2.Rows.Add(row); 40 } 41 42 foreach (DataRow row in table2.Rows) 43 { 44 Console.WriteLine($"A: {row["A"]}, B: {row["B"]}, D: {row["D"]}"); 45 } 46 Console.WriteLine("-------------------------"); 47 48 var leftOuterJoin = from t1 in table1.AsEnumerable() 49 join t2 in table2.AsEnumerable() 50 on new { A = t1.Field<int>("A"), B = t1.Field<int>("B") } 51 equals new { A = t2.Field<int>("A"), B = t2.Field<int>("B") } 52 into cGroup 53 from c in cGroup.DefaultIfEmpty() 54 select new 55 { 56 A = t1.Field<int>("A"), 57 B = t1.Field<int>("B"), 58 C = t1.Field<string>("C"), 59 D = (c == null) ? "N/A" : c.Field<string>("D") 60 }; 61 62 foreach (var r in leftOuterJoin) 63 { 64 Console.WriteLine($"A: {r.A}, B: {r.B}, C: {r.C}, D: {r.D}"); 65 } 66 } 67 } 68}

結果は:

イメージ説明

投稿2022/06/19 04:00

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

ベストアンサー

new DataColumn() {dt1.columns["A"],dt1.columns["B"]}

new DataColumn[] { dt1.Columns["A"], dt1.Columns["B"] }

では?その後ろも同じです。

投稿2022/06/18 09:48

KOZ6.0

総合スコア2626

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

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

退会済みユーザー

退会済みユーザー

2022/06/18 14:15 編集

目的は、 > 2つのCSVファイルを結合してSQLのLEFT OUTER JOINのように1つのテーブルにして、加工をすることです。 だそうです。エラーは回答で解決できるかもしれませんが、果たしてやりたいことができるのかどうか・・・
KishikawaHideto

2022/06/19 06:13

ありがとうございます。うまくいきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問