只要我可以添加 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
};