C# 如何使用外部变量创建动态Labda表达式?

C# 如何使用外部变量创建动态Labda表达式?,c#,linq,lambda,expression,C#,Linq,Lambda,Expression,我有一个场景,其中有两个表'side'和'item' 我正在尝试创建以下查询: _db.SideTable.Where(s => s.Active && !_db.ItemTable.Any(i => i.SIDE_1 == s.ID)); 但是,其中SIDE_1实际上是动态的(SIDE_1到SIDE_20),其中数字1-20来自变量“sideId” 我已尝试创建并执行以下操作: //访问参数的SIDE\u xxx属性 ParameterExpression par

我有一个场景,其中有两个表'side'和'item'

我正在尝试创建以下查询:

_db.SideTable.Where(s => s.Active && !_db.ItemTable.Any(i => i.SIDE_1 == s.ID));
但是,其中SIDE_1实际上是动态的(SIDE_1到SIDE_20),其中数字1-20来自变量“sideId”

我已尝试创建并执行以下操作:

//访问参数的SIDE\u xxx属性
ParameterExpression param=表达式参数(typeof(ItemTable));
Expression property=Expression.property(参数“SIDE_”+sideId);
//访问外部变量的ID属性
ParameterExpression var=Expression.Variable(typeof(SideTable),“s”);
Expression property2=Expression.Property(var,“ID”);
//是否将ID属性值设为int?因为SIDE_xxx属性可能为null,否则表达式将失败
var valExpr=Expression.Convert(property2,typeof(int?);
//表达式的主体只是一个相等的检查
表达式体=表达式.Equal(属性,valExpr);
//创建表达式
var expression=expression.Lambda(body,param);
//获取数据
_其中(s=>s.Active&!u db.ItemTable.Any(表达式)).ToList();
然而,当我运行此程序时,会遇到以下异常:

参数“s”未绑定在指定的LINQ到实体查询表达式中


我想我没有使用正确的语法来正确访问外部的“s”属性,但我不知道如何使用其他语法。

如果有两个表,首先需要连接这些表。一种简单的方法是使用System.Linq.Dynamic(来自nuGet)。。。将lambda创建为字符串,并将其传递给
Where()
方法。这里是它的文档:我实际上希望避免不得不引入更多的第三方依赖关系。您可能认为这应该很容易做到……您是在查询sql数据库吗?在这种情况下,您只需形成正确的sql查询即可执行它并获取所需的边表项。这里的问题是lambda表达式i=>i.SIDE_1==s.ID在上下文之外没有意义,因为您不知道s是谁。在您给出的示例中,s是属于外部lambda的捕获变量,但创建内部lambda时,s不存在。如果有两个表,则首先需要连接这些表。一种简单的方法是使用System.Linq.Dynamic(来自nuGet)。。。将lambda创建为字符串,并将其传递给
Where()
方法。这里是它的文档:我实际上希望避免不得不引入更多的第三方依赖关系。您可能认为这应该很容易做到……您是在查询sql数据库吗?在这种情况下,您只需形成正确的sql查询即可执行它并获取所需的边表项。这里的问题是lambda表达式i=>i.SIDE_1==s.ID在上下文之外没有意义,因为您不知道s是谁。在您给出的示例中,s是属于外部lambda的捕获变量,但创建内部lambda时,s不存在。