如果我有产品的话。
var p = new Product { Price = 30 };
我有以下linq查询。
var q = repo.Products().Where(x=>x.Price == p.Price).ToList()
在IQueryable提供程序中,我为包含一个常量表达式的p.Price返回了一个MemberExpression,但是我似乎无法从其中获得值"30“。
更新我已经尝试过了,但似乎不起作用。
var memberExpression = (MemberExpression)GetRootConstantExpression(m);
var fi = (PropertyInfo)memberExpression.Member;
var val = fi.GetValue(((ConstantExpression)memberExpression.Expression).Value, null);
干杯。
发布于 2010-04-11 20:25:43
您可以编译和调用以成员访问为主体的lambda表达式:
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();
}
解析表达式树时,局部求值是一种常见的技术。LINQ to SQL在相当多的地方做了这件事。
发布于 2010-12-10 07:15:33
MemberExpression right = (MemberExpression)((BinaryExpression)p.Body).Right;
Expression.Lambda(right).Compile().DynamicInvoke();
发布于 2010-04-11 20:17:36
常量表达式将指向编译器生成的捕获类。我没有包括决策点等,但以下是如何从中获得30点:
var p = new Product { Price = 30 };
Expression<Func<Product, bool>> predicate = x => x.Price == p.Price;
BinaryExpression eq = (BinaryExpression)predicate.Body;
MemberExpression productToPrice = (MemberExpression)eq.Right;
MemberExpression captureToProduct = (MemberExpression)productToPrice.Expression;
ConstantExpression captureConst = (ConstantExpression)captureToProduct.Expression;
object product = ((FieldInfo)captureToProduct.Member).GetValue(captureConst.Value);
object price = ((PropertyInfo)productToPrice.Member).GetValue(product, null);
price
现在是30
。请注意,我假设Price
是一个属性,但实际上您需要编写一个处理属性/字段的GetValue
方法。
https://stackoverflow.com/questions/2616638
复制相似问题