[英]Extending LINQ Expressions
新手 LINQ 表达式问题-
Expression<Func<TLookupModel, TValue>> idSelector;
IEnumerable<TLookupModel> source;
TValue id;
我正在尝试做(伪代码):
source.AsQueryable().FirstOrDefault(x => idSelector == id)
到目前为止,我的微弱尝试是:
var expressionParam = idSelector.Parameters.First();
ConstantExpression selectedValueConstant = Expression.Constant(id, typeof(TValue));
var idEqualExpression = Expression.Equal(idSelector, selectedValueConstant);
var lambda = Expression.Lambda<Func<TLookupModel, bool>>(idEqualExpression, expressionParam);
var selectedSourceItem = source.AsQueryable().FirstOrDefault(lambda);
我想这可以让你猜测我到目前为止的想法。 我尝试过使用和不使用参数,不同的 Expression 方法调用组合,试图从FirstOrDefault()
调用中获取“参数”,但是在阅读了大量教程后,我无法理解如何扩展一个“成员”表达式以这种方式等于一个常量。
你真的很接近。
您的 idExpression 是x => x.Property
形式的x => x.Property
。 但是,您将整个表达式传递给 Equal 表达式。 将其更改为仅传递正文:
var idEqualExpression = Expression.Equal(idSelector.Body, selectedValueConstant);
然后您可以编译 lambda 并将其传递给 FirstOrDefault 而不转换为可查询的:
var selectedSourceItem = source.FirstOrDefault(lambda.Compile());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.