1

只要我可以添加 DataRelations,以下查询就可以工作。但是,关系“Table2Table3”可能不再明确定义,所以我认为我需要删除它。旧关系严格连接 2 个字符串字段。如果 Table2.code = Table3.code and Table2.class = Table3.class OR Table2.code = Table3.code and Table2.class = "*" and Table3.class 是任何东西,则新关系存在。

我怎样才能实现这个条件并且仍然对 Table3.cost 字段求和?

我可以使用正则表达式吗?

我尝试创建一个匿名类相等(见下文),但无法在 equals 子句的右侧访问 Table2。

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")))
                };

示例表:

表 1:别名和优先级列表
-----------------
ID别名优先级
1 别名1 1
2 别名 2 2
3 别名3 4
4 别名4 3
table2:通过 ParentID 连接到 table1 的子记录(一对多)
-----------------
代码类 ParentID
代码 1 类 1 1
代码 2 类 2 1
代码 3 类 3 2
代码 4 类 4 4
代码5 * 3
表 3:数据,在新条件下加入
-----------------
代码类费用
代码 1 类 1 1.00
代码 1 类 1 10.00
code1 class1 26.00
代码 2 类 2 5.00
代码 2 类 2 0.00
code3 class3 1000.00
code5 class6 25.00
代码 5 类 7 26.00

预期输出:

别名 1 42.00
别名2 1000.00
别名4 0.00
别名3 51.00

此查询无法访问第二个匿名类范围内的“代码”:

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

我有一个几乎可以工作的查询。输出略有偏差——“alias3”与成本 = 0 的一个“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 回答
-1

我使用了两个 foreach 循环和四个单独的 LINQ 查询。如果您为此找到一个 LINQ 语句解决方案,请告诉我。

于 2010-03-11T15:53:35.593 回答