次のクエリは、DataRelations を追加できる限り機能します。ただ、「Table2Table3」という関係はもはや明確に定義されていない可能性があるので、削除する必要があると思います。古いリレーションは 2 つの文字列フィールドで厳密に結合されます。Table2.code = Table3.code and Table2.class = Table3.class OR Table2.code = Table3.code and Table2.class = "*" で、Table3.class が何でもある 場合、新しい関係が存在します。
この条件を実装し、Table3.cost フィールドを合計するにはどうすればよいですか?
正規表現を使用できますか?
匿名クラスの等価性を作成しようとしましたが (以下を参照)、Table2 は equals 句の右側にアクセスできませんでした。
var querytest = from x in ds.Tables[0].AsEnumerable()
orderby x.Field<int>("Priority")
select new
{
Name = x.Field<string>("alias"),
Amount = x.GetChildRows("Table1Table2")
.Sum(product => product.GetChildRows("Table2Table3")
.Sum(tx => tx.Field<decimal>("cost")))
};
サンプル テーブル:
table1: エイリアスと優先順位のリスト ----------------- ID エイリアスの優先度 1 エイリアス1 1 2 エイリアス 2 2 3 エイリアス3 4 4 エイリアス4 3
table2: ParentID (1 対多) によって table1 に結合された子レコード ----------------- コード クラス ParentID コード1 クラス1 1 コード 2 クラス 2 1 code3 class3 2 code4 class4 4 コード5 * 3
table3: データ、新しい条件で結合 ----------------- コードクラスのコスト コード 1 クラス 1 1.00 コード1 クラス1 10.00 コード1 クラス1 26.00 code2 class2 5.00 コード 2 クラス 2 0.00 code3 class3 1000.00 code5 class6 25.00 code5 class7 26.00
期待される出力:
エイリアス1 42.00 エイリアス2 1000.00 エイリアス4 0.00 エイリアス3 51.00
このクエリは、2 番目の匿名クラスのスコープ内の「コード」にアクセスできません。
var querytest2 = from aliases in ds.Tables[0].AsEnumerable()
join codes in ds.Tables[1].AsEnumerable()
on aliases.Field<int>("ID") equals codes.Field<int>("ParentID")
join data in ds.Tables[2].AsEnumerable()
on new {
code = codes.Field<string>("code"), classcode = codes.Field<string>("class") }
equals new {
code = data.Field<string>("code"), classcode = (data.Field<string>("class") == "*" ? codes.Field<string>("class") : data.Field<string>("class") }
orderby aliases.Field<int>("Priority")
select new
{
name = aliases.Field<string>("alias"),
cost = //somehow sum here
};