【问题标题】:How can I sum a field from a grandchild table in a LINQ to DataSet where clause?如何对 LINQ to DataSet where 子句中的孙表中的字段求和?
【发布时间】:2010-03-05 11:38:45
【问题描述】:

我认为我需要这样做,而是使用 LINQ to DataSets,因为“事务”表在 DB2 中并且没有数据上下文。

Linq query across three levels of tables to generate sum

我在 DataSet 上设置了两个 DataRelation:
1. 将类别(在我的示例中为 ds.tables[0])与产品(ds.tables[1])相关联
2. 将产品与交易相关联(ds.tables[2])

var query = from x in ds.tables[0].AsEnumerable()
    orderby x.Field<int>("Priority")
    select new {
        Name = x.Field<string>("Text"),
        Amount = //maybe using GetChildRows here???
    };

我真的不知道该怎么处理金额。提前致谢!

【问题讨论】:

  • 不清楚你要的Transactions表中的记录是在ds中加载还是只在数据库中。即使没有加载它们,您仍然可以在数据库中创建 DataRelation。如果它们被加载,那么它应该很容易做到。如果不是,事情会变得更加棘手。
  • 抱歉有任何混淆。一切都加载到 DataSet 中。类别和产品在 SQL Server 数据库中,而事务来自 DB2。我的另一个想法是将 DB2 加载到 SQL Server 中的临时表中并使用 LINQ to SQL,但我认为这会更简单。

标签: c# orm linq-to-dataset


【解决方案1】:

如果你需要在 Transactions 表中的行加载到 ds 中,那么我认为你可以这样做:

DataRelation relationToProducts;
DataRelation relationToTransactions;    
var query = from x in ds.tables[0].AsEnumerable()
orderby x.Field<int>("Priority")
select new {
    Name = x.Field<string>("Text"),
    Amount = x.GetChildRows(relationToProducts)
            .Sum(product => product.GetChildRows(relationToTransactions)
                    .Sum(tx => tx.Field<decimal>("Amount")))
};

【讨论】:

  • 我很快就会对此进行测试。
  • 与 DataRelation 约束完美配合。但是,我想我发现了另一个潜在的警告。如果我的 Transactions 记录并非全部具有相应的父值,则添加约束会引发 ArgumentException。 My Transactions 表可能包含在 Products 中没有对应父值的记录。所以,也许使用 DataRelation 和 GetChildRows 不是最好的主意。我应该问一个新问题吗?
  • 已修复:DataRelation(string, datacolumn, datacolumn, bool) 有另一个构造函数,其中 bool (createConstraints) 可以设置为 false。
  • 知道没有DataRelation我怎么能做到这一点吗?我不确定没有 GetChildRows("relation") 的语法
猜你喜欢
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-12
  • 2012-08-07
  • 1970-01-01
  • 2012-02-25
  • 1970-01-01
相关资源
最近更新 更多