【发布时间】: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