gpt4 book ai didi

c# - 如何创建为 SelectMany resultSelector 返回匿名类型的 C# LambdaExpression

转载 作者:行者123 更新时间:2023-11-30 18:40:11 25 4
gpt4 key购买 nike

我正在构建一个动态查询,它可以有 nWhere 方法调用和 nSelectMany调用取决于用户输入。例如我可能有:

var qZ = entityContext.TableA
.SelectMany(a=>a.TableB, (a,t)=>new{a,t} )
.Where(a=>a.t.FieldID==21)
.Where(a=> EntityFunctions.Left(a.t.Value,1)=="p")
.SelectMany(a=>a.a.TableC, (a,t)=>new{a,t} )
.Where(a=>a.t.FieldID==22)
.Where(a=> a.a.t.Value=="Peter" && a.t.Value=="Pan")
.Where(a=> a.a.a.TypeID==3)
.Select(a=> new{ a.a.a.ItemID }
).Distinct();

在我编写的方法中,我使用返回 IQueryable 的辅助方法,如下面的返回行所示。

return query.Provider.CreateQuery(
Expression.Call(typeof(Queryable),
"Where",
new Type[] {query.ElementType},
query.Expression, predicateLambda)
);

我能够为所有需要的各种查询属性-值 对创建 LambdaExpressions,但我无法为 resultSelector 创建一个Queryable.SelectMany.

我们如何在表达式树中创建 (a,t) => new{a=a, t=t}?或者我们如何使用如下所示的 Expression.Call 实现与上面的 .SelectMany 相同的结果?

Expression.Call(typeof(Queryable), 
"SelectMany",
????????,
????????
);

我已经尝试使用不需要 resultSelectorSelectMany 重载,它在某种程度上起作用,但是,我不知道如何引用属性后续方法调用中的 t。

我发现这个 lambda 表达式 ((a,t) => new{a=a, t=t}) 在整个网络上都与 SelectMany 相关联,但我找不到任何有关如何将其转换为表达式树的示例。

更新:让我们重新定义问题。我可以像这样传递 lambda

var q = entityContext.TableA.AsQueryable();

var q1 = Queryable.SelectMany(q, a => a.TableB, (a, t) => new { a = a, t = t });

var q2 = Queryable.Where(q1,a=>a.t.FieldID==22);

然而,这是有效的,因为我不知道提前需要调用多少 SelectMany,并且由于每次调用都更改为 IQueriable 的匿名类型,是否有一种方法可以转换(和重新转换)匿名类型键入单个变量?这样我就可以循环遍历并将任何必要的方法应用于变量,然后在构建查询后枚举以获取结果。像这样的东西:

var q = entityContext.TableA..AsQueryable();

q = Queryable.SelectMany(q, a => a.TableB, (a, t) => new { a = a, t = t });

q = Queryable.Where(q,a=>a.t.FieldID==22);

(顺便说一句:这行不通)

最佳答案

我最终解决这个问题的方式需要范式转变。上面的第一个查询是基于这样一个事实,即我学会了通过将我需要的所有表连接在一起来编写查询,以便我可以访问过滤和选择这些表中的字段。

SelectMany() 创建连接,当时我的想法周围的框要求如果我需要过滤表中的特定列,我必须将该表连接到我的查询。这反过来又改变了我的 IQueryable 的类型,导致我无法在设计时预测 IQueryable 的类型。

回答:

第 1 步:将 IQueryable 的类型设置为其需要返回的输出类型。在上面的例子中,结果总是 IQueryable。

第 2 步:利用表达式动态创建 WHERE 谓词,包括创建适当过滤器所需的任何和所有表。这总是返回 Expression> 和我们很容易解释的所有其他变量。请记住,在 EF 中,如果仅在 Where() 中需要它们,则无需在 Where() 外部加入表。

关于c# - 如何创建为 SelectMany resultSelector 返回匿名类型的 C# LambdaExpression,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8669139/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com