【问题标题】:How to declare a IQueryable variable to be built by groupby in switch statement如何在 switch 语句中声明由 groupby 构建的 IQueryable 变量
【发布时间】:2021-04-27 04:52:50
【问题描述】:

我有一个查询变量,例如:

var q1 = from db in db.customers select db

我正在构建带有一些条件的查询:

switch(userInput)
{
  case "name" : {var q2 = q1.GroupBy(q=>q.name); break;}
  case "age": {var q2 = q1.GroupBy(q=>q.age); break;}
  case "date": {var q2 = q1.GroupBy(q=>q.date); break;}
...etc
}
q3 = from q in q2 select q;

如果这样做,我将无法访问我在 switch 语句中声明的 q2 并继续使用 q3 构建我的查询。但是,如果我在 switch 语句之外声明:

IQueryable q2;
switch(userInput)
{
  case "name" : q2 = q1.GroupBy(q=>q.name); break;
  case "age": q2 = q1.GroupBy(q=>q.age); break;
  case "date": q2 = q1.GroupBy(q=>q.date); break;
...etc
}

q3 = from q in q2 select q;

它会给我一个错误,说“IQueryable q2 不包含 'select' 的定义。”

我还尝试使用类型声明我的 q2,但正如您所见,我的 switch 语句可能是字符串、int 或可为空的日期(DateTime?)类型。如何为switch语句声明一个可用的可查询变量?

谢谢。

【问题讨论】:

  • 假设 q1 也是 IQueryable 然后只是 q1 = q1.GroupBy...
  • 问题是:您以后要对查询做什么?
  • 你不能。 C# 是一种类型语言——q2 必须是什么类型?你可以试试q2.Cast<object>(),但我认为你不能轻松地跨类型完成你想要的。
  • @SvyatoslavDanyliv,在步骤 q2 之后,我的 q3 将用于选择一个用户定义的变量进行求和。假设我还有两个名为“储蓄”和“支票”的字段。我将根据 q2 中分组的特征对这些字段进行汇总,并返回总节省或检查,或者仅根据用户的要求进行计数。
  • 为了在 SQL 生成中有效,它应该是完全动态的(ExpressionTree 构建)。这不是一项简单的任务,但有库 github.com/zzzprojects/System.Linq.Dynamic.Core 和 GroupBy 的样本 github.com/zzzprojects/System.Linq.Dynamic.Core/blob/master/…

标签: c# entity-framework linq


【解决方案1】:

所有这些道具似乎很容易表示为一个字符串,并且原始道具在分组中可用,所以只需使用类似于您的第二种形式的东西(但它可能会让您的生活更容易将持有返回类型的变量声明为@987654321 @) 并按年龄/日期的.ToString() 对它们进行分组以给出一致的结果,或者在开关中对它们中的每一个执行相同的select 以给出一致的结果(并适当地声明返回持有人)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-16
    • 1970-01-01
    • 1970-01-01
    • 2020-12-27
    • 2021-11-24
    • 1970-01-01
    相关资源
    最近更新 更多