新手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()
调用中获取“参数”,但是在阅读了许多教程之后,我无法理解以这种方式将“成员”表达式扩展为等于常量。
答案 0 :(得分:2)
你真的很亲近。
您的idExpression是x => x.Property
形式的表达式。但是,您要将整个表达式传递给Equal表达式。更改为仅通过正文:
var idEqualExpression = Expression.Equal(idSelector.Body, selectedValueConstant);
然后,您可以编译lambda并将其传递给FirstOrDefault而不转换为可查询的内容:
var selectedSourceItem = source.FirstOrDefault(lambda.Compile());