【发布时间】:2011-07-12 21:15:01
【问题描述】:
我正在动态生成要发送到 LINQ to Entities 的表达式树。我提供了一个框架,我允许开发人员将输出列指定为 lambda 表达式。
例如,假设他们有一个列,他们可以指定从数据库中提取值的方式是:
p => p.Aliases.Count()
另一列是:
p => p.Names.Where(n => n.StartsWith("hello"))
这里的问题是我需要将这两个组合成一个表达式。
我的第一次尝试是:
getter = field.SelectorExpression.Body;
我收到错误消息The parameter 'p' was not bound in the specified LINQ to Entities query expression,因为LINQ 无法知道p.Aliases.Count() 中的P 是什么。
接下来我尝试的是:
getter = Expression.Invoke(field.OrderBySelector, new[] {parameter});
但是,我收到了The LINQ expression node type 'Invoke' is not supported in LINQ to Entities. 的消息,这也是因为我不希望 SQL Server 知道如何运行 lambda 表达式。
现在基本都是这样的表达方式:
item => new MyClass
{
SomeValue = item.Name, // this was generated from some other code
AnotherValue = item.SomeOtherColumn, // there can be lots of these
AliasCount = p.Aliases.Count() // here of course is the problem
}
显然,当我用 item 的表达式(我有并且知道如何使用)构建它时,我想用“p”替换表达式。
TLDR 是否有一种简单的方法可以将 LambdaExpression 中使用的参数的所有实例替换为另一个表达式?
【问题讨论】:
-
可能喜欢stackoverflow.com/questions/5430996/…?让我知道是否可以回答(“访客”方法是第一个尝试的方法)
-
您愿意解释一下吗?我已阅读所有但不明白:/ p => p.Names.Where(n => n.StartsWith("hello")) - 是单个表达式,其中单个表达式的参数中的一个参数是另一个表达...
-
Marc Gravell,你简直就是男人中的神。你回答这个问题的速度比我把它放在我的代码中并测试它还快!
-
请注意,我投票结束,因为这是完全重复的
标签: .net linq-to-entities expression-trees