0

私はこれに困惑しています。

2つを1つにマージしようとしていDataTableます。できればlinqこのタスクを実行するために使用しますが、問題は、結合の条件を動的に追加する必要があることです。各テーブルのデータは、ストアドプロシージャへの2つの異なる呼び出しから取得され、使用される呼び出しは切り替えることができます。そのため、結果は列の数と使用可能な主キーが異なる可能性があります。
目標は、最初の結果セットの通常の文字列を、Unicodeを含むことができる2番目のデータベースに置き換えることです(ただし、主キーの特定の組み合わせの値が含まれている場合のみ)。

私のlinqクエリは次のようになります。

var joined = (from DataRow reg in dt1.Rows
                 join DataRow uni in dt2.Rows
                     on new { prim1 = reg.ItemArray[0], prim2 = reg.ItemArray[1] }
                     equals new { prim1 = uni.ItemArray[0], prim2 = uni.ItemArray[1] }
                 select new
                     {
                         prim1 = reg.ItemArray[0],
                         prim2 = reg.ItemArray[1],
                         value1 = reg.ItemArray[4],
                         value2 = uni.ItemArray[3] ?? reg.ItemArray[3]
                     }
                );

これは私が望むものには完全に機能しますが、私が言ったように、各テーブルのどの列が主キーであるかを定義できる必要があるので、これは次のとおりです。

join DataRow uni in dt2.Rows
                     on new { prim1 = reg.ItemArray[0], prim2 = reg.ItemArray[1] }
                     equals new { prim1 = uni.ItemArray[0], prim2 = uni.ItemArray[1] } 

DataRelationテーブル間に作成する、またはlinq主キーの動的な追加を実行する前などに置き換える必要があります。

また*、最初の結果セットの列数がわからないため、各列を指定するのではなく、SQLのようなものを選択する必要があります。

また、主キーを追加してマージを実行してテーブルを結合しようとしましたが、dt2のどの列を選択してdt1のどの列を上書きするのですか?

DataTable join = new DataTable("joined");
join = dt1.Copy();
join.Merge(dt2, false, MissingSchemaAction.Add);
join.AcceptChanges();

VS2012を使用しています。

4

1 に答える 1

0

最終的には、主キーの関係や結合をまったく作成しない、非常に単純なアプローチを使用することになりました。問題を解決するためのよりエレガントでパフォーマンスに効果的な方法があると確信しています。

基本的に、Linqのソリューションを適応させて、where条件を動的に追加しました。ここで、結合する代わりに、動的に.Where-clausesを追加します。

このようにして、行をループし、動的に追加された主キーごとに比較できます。

foreach (DataRow regRow in dt1.Rows)
{
    //Select all rows in second result set
    var uniRows = (from DataRow uniRow in dt2.Rows select uniRow);
    //Add where clauses as needed
    if (firstCondition) { uniRows = uniRows.Where(x => x["SalesChannel"] == "001"); }
    else if (secondCondition) { uniRows = uniRows.Where(x => x["Language"] == "SV"); }
    else (thirdCondition) { uniRows = uniRows.Where(x => x["ArticleNo"] == "242356"); }
    // etc...
}

各行は、2番目の結果セットの行の減少リストと比較されます。

于 2013-03-20T17:38:41.000 に答える