1

次のクエリは、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
                 };
4

2 に答える 2

-1

2 つの foreach ループと 4 つの個別の LINQ クエリを使用しました。これに対する単一の LINQ ステートメント ソリューションが見つかった場合はお知らせください。

于 2010-03-11T15:53:35.593 に答える
-1

ほとんど機能するクエリがあります。出力はわずかに異なります。「alias3」は、コスト = 0 の 1 つの「lineitem」と複製されます (以下の出力を参照)。クラス lineitem には、パブリック メンバー、Order、Text、および cost があります。

var querytest = ((from aliases in Table1.AsEnumerable()
          select new mylineitem
          {
              Order = aliases.Field<int>("Priority")
              Text = aliases.Field<string>("alias"),
              cost = aliases.GetChildRows("Table1Table2")
                  .Where(codes => codes.Field<string>("class") != "*")
                      .Sum(codes => codes.GetChildRows("Table2Table3")
                          .Sum(data => data.Field<decimal>("cost")))
          }).Concat(from aliases in Table1.AsEnumerable()
                    join codes in Table2.AsEnumerable()
                        on aliases.Field<int>("ID") equals codes.Field<int>("ParentID")
                    join data in Table3.AsEnumerable()
                        on codes.Field<string>("code") equals data.Field<string>("code") into temp
                    where codes.Field<string>("class") == "*"
                    select new mylineitem
                    {
                        Order = aliases.Field<int>("Priority"),
                        Text = aliases.Field<string>("alias"),
                        cost = temp.Sum(x => x.Field<decimal>("cost"))
                    })).OrderBy(a => a.Order);

        foreach (var lineitem in querytest)
        {
            Console.WriteLine(lineitem.Text + " " + lineitem.cost);
        }

出力:

エイリアス1 42
エイリアス2 1000
エイリアス4 0
alias3 0 -- この行はここにあってはなりません。
エイリアス3 51
于 2010-03-09T14:02:43.597 に答える