新手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
形式的表达式。但是,您将整个表达式传递给Equal表达式。改变只传递身体:
var idEqualExpression = Expression.Equal(idSelector.Body, selectedValueConstant);
然后你可以编译lambda并将其传递给FirstOrDefault而不转换为可查询的:
var selectedSourceItem = source.FirstOrDefault(lambda.Compile());