【问题标题】:Linq Dynamic Group ByLinq 动态分组依据
【发布时间】:2012-10-04 00:09:14
【问题描述】:

您好,我需要在 vb.net 中具有 group by 的动态 linq 查询。

我的查询如下。

在第一个查询中,我需要按两列分组,但在第二个查询中,我只需要按一列分组。这取决于用户希望如何查看报告。

如何根据用户的选择在运行时生成这些查询?

提前致谢。

Dim query = From r In dtString.AsEnumerable
        Group r By Key0 = r.Field(Of String)("country"),
                   Key1 = r.Field(Of String)("region") Into Group
        Select Key0, Key1,
               DebitTotal = Group.Sum(Function(r) r.Field(Of Decimal)("debit")),
               CreditTotal = Group.Sum(Function(r) r.Field(Of Decimal)("credit"))


Dim query = From r In dtString.AsEnumerable
        Group r By Key0 = r.Field(Of String)("country") Into Group
        Select Key0
               DebitTotal = Group.Sum(Function(r) r.Field(Of Decimal)("debit")),
               CreditTotal = Group.Sum(Function(r) r.Field(Of Decimal)("credit"))

【问题讨论】:

  • 我不明白,你为什么不用If..Else
  • 我使用了选择案例。但是关键字段计数会根据用户的选择而变化,它可以是 1 或 7。所以我不得不重新编码相同的东西 7 次。如果有一天报告关键字段数增加到 100,这将不是动态的 :)

标签: vb.net linq dynamic group-by


【解决方案1】:

正如您从 Select 子句中看到的,您的两个查询的结果不是(匿名)类型兼容的。您最简单的解决方案可能是将您的第二个查询更改为具有第二个冗余或常量组键的内容。

例如

query = From r In dtString.AsEnumerable
    Group r By Key0 = r.Field(Of String)("country"),
               Key1 = r.Field(Of String)("country") Into Group
    Select Key0, Key1,
           DebitTotal = Group.Sum(Function(r) r.Field(Of Decimal)("debit")),
           CreditTotal = Group.Sum(Function(r) r.Field(Of Decimal)("credit"))

query = From r In dtString.AsEnumerable
    Group r By Key0 = r.Field(Of String)("country"),
               Key1 = "ignored" Into Group
    Select Key0, Key1,
           DebitTotal = Group.Sum(Function(r) r.Field(Of Decimal)("debit")),
           CreditTotal = Group.Sum(Function(r) r.Field(Of Decimal)("credit"))

(未经测试)

然后您必须调整结果显示以在需要时忽略key1

【讨论】:

  • 谢谢,我想最有效的解决方案是你的第一个例子。
猜你喜欢
  • 2014-12-09
  • 2021-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-09
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
相关资源
最近更新 更多