71881


開発環境: Visual Studio 2017 c＃

複数のDataTable内のカラム名が同じだったら処理をするというIf文はどのように書けばよろしいでしょうか。  
oracleのカラム  
カラー,サイズ,品名,バーコード

csvのカラム  
バーコードのみ

Resultのカラム  
カラー,サイズ,品名  
だった場合、foreachのなかでoracleのバーコードカラム＝csvのバーコードカラムにして処理を進める？  
書き方があっているのか微妙ですが前後でしていること含めて書いてます。  
分かりにくい思いますが、回答よろしくお願いします。

[code]

    //CSVデータのDataTable
    DataTable csvDT = new DataTable();
    //OracleデータのDataTable
    DataTable oracleDT = new DataTable();
    //結果用のDataTable作成
    DataTable ResultDT = new DataTable("ReasultDataTable");
    //ResultDTからユニークリスト作成
    DataTable dtDistinct = ResultDT.DefaultView.ToTable(true,"Barcode");
    //ユニークリストを使ってSQLを書く
    DataRows[] rows =dtDistinct.select("品名,カラー,サイズ,Barcode");
    //SQLを投げてOracleDTで受け取る
    //oracleDTとcsvDTをぶつけてresultDTに書き込む
    foreach (DataRow r in csvDT.Rows)
    {
        if(r["Barcode"] == oracleDT.Columns["Barcode"])
        {
         //csvDtの品番　=oracleDTのバーコード
         ResultDT["品番"]=r["品番"];
         //csvDtのサイズ=oracleDTのバーコード
         ResultDT["サイズ"]=r["サイズ"];
    　　　//csvDtのカラー=oracleDTのバーコード
         ResultDT["カラー"]=r["カラー"];
    　　　}
    }
    
[/code]


CC BY-SA 4.0
2020-11-11T07:10:55.273
71865
2020-11-12T02:14:18.757
2020-11-11T17:10:51.343
42419
42419
question
c#
DataTable if(カラム＝カラム)について


LINQの知識・経験があるわけでは無く、検索結果からの推測ですが。

この辺の記事を参考にすると、`//結果用のDataTable作成`以後は以下のように書き直しになるのでは？
(結果テーブルの列が`品番`(Barcode?)なのか`品名`なのか曖昧ですが)  
前回 @sayuri さん紹介記事の中の最初の [例](https://docs.microsoft.com/ja-
jp/dotnet/framework/data/adonet/creating-a-datatable-from-a-query-linq-to-
dataset#example)  
[LINQでの内部結合・外部結合](https://qiita.com/H-Takayama/items/0e0a962f9ebc59547e4d) の
[内部結合の方法](https://qiita.com/H-Takayama/items/0e0a962f9ebc59547e4d#%E5%86%85%E9%83%A8%E7%B5%90%E5%90%88%E3%81%AE%E6%96%B9%E6%B3%95)  
[内部結合の実行](https://docs.microsoft.com/ja-jp/dotnet/csharp/linq/perform-inner-
joins)  
[左外部結合の実行](https://docs.microsoft.com/ja-jp/dotnet/csharp/linq/perform-left-
outer-joins)

[code]

    var query =
        from csv in csvDT
        join db in oracleDT
        on csv.Barcode equals db.Barcode
        select new
        {
            Barcode = db.Barcode,  // 品名なら最後の行に Name = db.Name
            Size = db.Size,
            Color = db.Color
        };
    
    DataTable ResultDT = query.CopyToDataTable();
    
[/code]

* * *

**コメント対応調査**

この辺の記事を見ると上記ソースは以下のようになるのかもしれません。  
[LINQ to DataSet でのクエリ](https://docs.microsoft.com/ja-
jp/dotnet/framework/data/adonet/queries-in-linq-to-dataset)  
[ジェネリック メソッド Field および SetField (LINQ to
DataSet)](https://docs.microsoft.com/ja-
jp/dotnet/framework/data/adonet/generic-field-and-setfield-methods-linq-to-
dataset)  
[How do I get this Linq query with custom join into a
DataSet?](https://stackoverflow.com/q/16574125/9014308)

DataTable指定には`.AsEnumerable()`を付ける  
カラムへのアクセスには`["カラム名"]`か`Field<型>("カラム名")`/`SetField("カラム名", 値)`を使う

こんな感じでしょうか。

[code]

    var query =
        from csv in csvDT.AsEnumerable()
        join db in oracleDT.AsEnumerable()
        on csv.Field<string>("Barcode") equals db.Field<string>("Barcode")
        select new
        {
            Barcode = db.Field<string>("Color"),  // 品名なら最後の行に Name = db.Field<string>("Name")
            Size = db.Field<string>("Size"),
            Color = db.Field<string>("Color")
        };
    
[/code]

あるいは、何処かの変数/カラム/DataTableやその定義で`public`指定が必要なものが抜けているとか。  
[”～はアクセスできない保護レベルになっています”と表示された場合の解決法](https://allmoreidea.hatenablog.com/entry/2018/06/30/112231)


CC BY-SA 4.0
2020-11-12T00:36:34.560
71881
2020-11-12T02:14:18.757
2020-11-12T02:14:18.757
26370
26370
71865
answer