C# 扩展LINQ表达式

C# 扩展LINQ表达式,c#,linq,expression,C#,Linq,Expression,新手林克表情问题- Expression<Func<TLookupModel, TValue>> idSelector; IEnumerable<TLookupModel> source; TValue id; 到目前为止,我的微弱尝试是: var expressionParam = idSelector.Parameters.First(); ConstantExpression selectedValueConstant = Expression.Co

新手林克表情问题-

Expression<Func<TLookupModel, TValue>> idSelector;
IEnumerable<TLookupModel> source;
TValue 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);
var expressionParam=idSelector.Parameters.First();
ConstantPression selectedValueConstant=表达式常数(id,typeof(TValue));
var idEqualExpression=Expression.Equal(idSelector,selectedValueConstant);
var lambda=表达式.lambda(idequalpression,expressionParam);
var selectedSourceItem=source.AsQueryable().FirstOrDefault(lambda);
我想这可以让你猜到我到目前为止是怎么想的。我尝试过使用和不使用参数、表达式方法调用的不同组合,试图从
FirstOrDefault()
调用中获取“参数”,但在阅读了大量教程后,我无法理解如何用这种方式将“member”表达式扩展为等于常数。

你已经非常接近了

idExpression是一个
x=>x.Property
形式的表达式。但是,您要将整个表达式传递给相等的表达式。将其更改为仅通过实体:

var idEqualExpression = Expression.Equal(idSelector.Body, selectedValueConstant);
然后,您可以编译lambda并将其传递给FirstOrDefault,而无需强制转换到可查询文件:

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

FirstOrDefault
采用lambda,而不是布尔表达式。你能更正这个示例吗?@NetMage我确实将它标记为伪代码,但编辑了所有代码。因此它看起来像是
idselector
Func
,但你没有传入参数。。。如果您试图使用
Expression
并构建它们,这些细节很重要。您的意思是
idselector(x)=id
?能否显示
idselector
的示例?我想您需要更换ExpressionVisitor。
var selectedSourceItem = source.FirstOrDefault(lambda.Compile());