扩展LINQ表达式

时间:2019-04-29 18:29:14

标签: c# linq expression

新手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()调用中获取“参数”,但是在阅读了许多教程之后,我无法理解以这种方式将“成员”表达式扩展为等于常量。

1 个答案:

答案 0 :(得分:2)

你真的很亲近。

您的idExpression是x => x.Property形式的表达式。但是,您要将整个表达式传递给Equal表达式。更改为仅通过正文:

var idEqualExpression = Expression.Equal(idSelector.Body, selectedValueConstant);

然后,您可以编译lambda并将其传递给FirstOrDefault而不转换为可查询的内容:

var selectedSourceItem = source.FirstOrDefault(lambda.Compile());