扩展LINQ表达式

问题描述 投票:2回答:1

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

c# linq expression
1个回答
2
投票

你真的很亲密。

您的idExpression是x => x.Property形式的表达式。但是,您将整个表达式传递给Equal表达式。改变只传递身体:

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

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

var selectedSourceItem = source.FirstOrDefault(lambda.Compile());
© www.soinside.com 2019 - 2024. All rights reserved.