本文介绍了访问当然成员pression的价值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如果我有一个产品。

var p = new Product { Price = 30 };

和我有以下LINQ查询。

and i have the following linq query.

var q = repo.Products().Where(x=>x.Price == p.Price).ToList()

在一个IQueryable供应商,我得到一个MemberEx pression回其中包含了恒前pression的p.Price,但是我似乎无法从中获得值30后。

In an IQueryable provider, I get a MemberExpression back for the p.Price which contains a Constant Expression, however I can't seem to get the value "30" back from it.

更新
我曾经试过,但它似乎并没有工作。

UpdateI have tried this but it doesn't seem to work.

var memberExpression = (MemberExpression)GetRootConstantExpression(m);
var fi = (PropertyInfo)memberExpression.Member;
var val = fi.GetValue(((ConstantExpression)memberExpression.Expression).Value, null);

干杯。

推荐答案

您可以编译和调用一个lambda前pression体为成员访问:

You can compile and invoke a lambda expression whose body is the member access:

private object GetValue(MemberExpression member)
{
    var objectMember = Expression.Convert(member, typeof(object));

    var getterLambda = Expression.Lambda<Func<object>>(objectMember);

    var getter = getterLambda.Compile();

    return getter();
}

本地的评价是一种常见的技术分析前pression树时。 LINQ to SQL的做到这一点确切的事情在不少地方。

Local evaluation is a common technique when parsing expression trees. LINQ to SQL does this exact thing in quite a few places.

这篇关于访问当然成员pression的价值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

11-03 03:18