- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个带有 select
的 Linq 查询,从我的 Linq 查询提供程序那里我得到一个包含 MethodCallExpression
的表达式树,但只是如何从 MethodCallExpression
中获取选择的投影?
internal static object Execute(Expression expression, bool isEnumerable)
{
var whereExpression = expression as MethodCallExpression;
if (whereExpression == null) throw new InvalidProgramException("Error");
foreach (var arg in whereExpression.Arguments)
{
if (arg is UnaryExpression)
{
var unaryExpression = arg as UnaryExpression;
var lambdaExpression = unaryExpression.Operand as LambdaExpression;
if (lambdaExpression == null) continue;
// Here I would like to get the select projections, in this example the "word" projection ...
查询可能如下所示:
var queryable = new MyQueriableClass();
var query = from thing in queryable
where thing.id == 1
select word;
最佳答案
不是很清楚你在做什么,但是
// note the AsQueryable! Otherwise there is no
// Expression tree!
var words = new List<string>() { "an", "apple", "a", "day" }.AsQueryable();
// Note that even IQueryable<string> query = words;
// is a perfectly good query without a projection!
// The query
// from word in words where word.Length > 0 select word
// doesn't have a select too (try looking at the
// expression tree... The select has been elided)
// The projection if not present is implicit, the
// whole object.
var query = from word in words
select word;
var exp = query.Expression;
var methodCallExpression = exp as MethodCallExpression;
if (methodCallExpression != null)
{
MethodInfo method = methodCallExpression.Method;
if (method.DeclaringType == typeof(Queryable) && method.Name == "Select")
{
var source = methodCallExpression.Arguments[0];
var selector = methodCallExpression.Arguments[1];
// The selector parameter passed to Select is an
// Expression.Quote(subexpression),
// where subexpression is the lambda expression
// word => word here
if (selector.NodeType != ExpressionType.Quote)
{
throw new NotSupportedException();
}
UnaryExpression unary = (UnaryExpression)selector;
Expression operand = unary.Operand;
if (operand.NodeType != ExpressionType.Lambda)
{
throw new NotSupportedException();
}
LambdaExpression lambda = (LambdaExpression)operand;
// This is the "thing" that returns the result
Expression body = lambda.Body;
}
}
末尾的 body
应该是您想要的(或者可能是末尾之前的 lambda
)。请注意代码块开头的注释。
关于c# - 从 MethodCallExpression 获取投影,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29721339/
我有一个方法Method private static int Method(int n) { return n; } 我在我的 ExpressionVisitor 中覆盖了 VisitMet
如果我有一个方法名称和方法的参数,我如何为该方法创建一个 MethodCallExpression? 这是一个示例方法: public void HandleEventWithArg(int arg)
我正在尝试使用表达式树构建一个 lambda 查询,以使其在整个应用程序中通用。我最初的尝试基于找到的代码 here .我更改了代码,以便它执行比较以返回 100 个实体,这些实体的 LastName
我正在努力让我的用户更方便地使用我的图书馆。 我有一个接口(interface) I 和一个类 A ... public interface I { int f(int i); } publi
我正在尝试使用 ExpressionVisitor 来修改调用方法的表达式,但未能成功。我有一个 SearchService 封装了搜索逻辑,并希望能够修改传递的搜索参数。 应修改并运行 Search
我正在尝试实现以下代码: db.Invoices.Where(x => Dimensions.All(y => x.DimensionSet.Entries.Any(dim => (d.Dimensi
我正在玩 Roslyn CTP nuget 包,我想我会熟悉 SyntaxVisitor<>类,所以我正在创建一个 Roslyn.Compilers.CSharp.SyntaxNode至 System
我正在尝试学习表达式树,并且我创建了一个方法 Expression> 如果满足某些条件则执行它 - 请参阅下面的代码。 private static void TryCommand(E
如何获取 MethodCallExpression 的参数值? 今天我这样做了,但是速度不够快: private static object GetArgumentValue(Expression e
我有一个带有 select 的 Linq 查询,从我的 Linq 查询提供程序那里我得到一个包含 MethodCallExpression 的表达式树,但只是如何从 MethodCallExpress
我希望使用表达式树创建以下 Linq 表达式: var result2 = soldiers.OrderByDescending(soldier => soldier.Ranks.OrderBy(r=
我有一个查询,我需要对其应用 n 个过滤器。但是我必须使用表达式。到目前为止,我已经为每个过滤器构造了表达式,效果很好。问题是我想将这些过滤器连接到一个表达式中,这样我就可以将它用作 LINQ 的 .
无论维度如何,索引数组都是一种方法调用,因为它涉及调用索引器运算符。 那为什么方法重载了System.Linq.Expressions.Expression.ArrayIndex那takes a si
我有一个 MethodCallExpression 包含这样的日期调用 DateTime.UtcNow.AddDays(-10); 我希望能够将其编译成它所代表的实际日期,但由于我使用的是 Xamar
这是一个打印MethodCallExpression 方法签名的简单应用程序: using System; using System.Linq; using System.Linq.Expressio
在为 GET 请求执行之前,我需要向 MethodCallExpression 添加参数 这是加载所有员工的 OData GET 请求: server/employees?$filter=birthd
我正在尝试创建一个带有方法调用的通用表达式 Enumerable.Contains 所以基本上我想实现这个简单的 lambda x => collection.Contains(x.SomePrope
给定以下类: public class MyClass { private readonly UrlHelper _urlHelper; // constructor left out
以下代码抛出此异常的原因是什么,说“表达式必须是 MethodCallExpression。我认为调用 Action 是...... Action startBouncePolling =
我有一个处理 MethodCallExpression 的自定义 LINQ 提供程序有一个 OrderBy其中的子句。我怎样才能得到 OrderBy条款以便我可以处理它? 最佳答案 我想通了,这是方法
我是一名优秀的程序员,十分优秀!