C# 数组属性筛选器的动态lambda表达式

C# 数组属性筛选器的动态lambda表达式,c#,linq,lambda,C#,Linq,Lambda,根据要求,我想使用C#创建一个动态lambda表达式 例如,我想生成如下的动态查询 Employee. Address[1].City 我该怎么做?请注意,该属性是动态的 我试过这个密码 var item = Expression.Parameter(typeof(Employee), "item"); Expression prop = Expression.Property(item, "Address", new Expression[] { Expression.Constant[1

根据要求,我想使用C#创建一个动态lambda表达式

例如,我想生成如下的动态查询

Employee. Address[1].City
我该怎么做?请注意,该属性是动态的

我试过这个密码

var item = Expression.Parameter(typeof(Employee), "item");

Expression prop = Expression.Property(item, "Address", new Expression[] { Expression.Constant[1] });
prop = Expression.Property(prop, "City");

var propValue = Expression.Constant(constraintItem.State);
var expression = Expression.Equal(prop, propValue);
var lambda = Expression.Lambda<Func<Line, bool>>(expression, item);
var item=Expression.Parameter(typeof(Employee),“item”);
Expression prop=Expression.Property(项“Address”,新表达式[]{Expression.Constant[1]});
prop=表达式.属性(prop,“City”);
var propValue=表达式常数(constraintItem.State);
变量表达式=表达式.Equal(prop,propValue);
var lambda=Expression.lambda(表达式,项);
但它没有起作用

任何帮助都将不胜感激

谢谢。

您的“动态查询”表达式(它不是真正的查询,它是一个简单的
成员表达式
)可以按如下方式生成:

ParameterExpression param = Expression.Parameter(typeof(Employee), "item");
MemberExpression address = Expression.Property(param, "Address");
BinaryExpression indexedAddress = Expression.ArrayIndex(address, Expression.Constant(1));
MemberExpression city = Expression.Property(indexedAddress, "City"); // Assuming "City" is a string.

// This will give us: item => item.Address[1].City
Expression<Func<Employee, string>> memberAccessLambda = Expression.Lambda<Func<Employee, string>>(city, param);
就代码而言:不确定为什么要创建一个lambda,其中委托类型是
Func
,而输入显然应该是
Employee
。参数类型必须始终与委托签名匹配

编辑

非数组索引器访问示例:

ParameterExpression param = Expression.Parameter(typeof(Employee), "item");
MemberExpression address = Expression.Property(param, "Address");

IndexExpression indexedAddress = Expression.MakeIndex(
    address,
    indexer: typeof(List<string>).GetProperty("Item", returnType: typeof(string), types: new[] { typeof(int) }),
    arguments: new[] { Expression.Constant(1) }
);

// Produces item => item.Address[1].
Expression<Func<Employee, string>> lambda = Expression.Lambda<Func<Employee, string>>(indexedAddress, param);

// Predicate (item => item.Address[1] == "Place"):
BinaryExpression eq = Expression.Equal(indexedAddress, Expression.Constant("Place"));
Expression<Func<Employee, bool>> predicateLambda = Expression.Lambda<Func<Employee, bool>>(eq, param);
ParameterExpression param=Expression.Parameter(typeof(Employee),“item”);
MemberExpression地址=Expression.Property(参数,“地址”);
IndexExpression indexedAddress=Expression.MakeIndex(
地址:,
索引器:typeof(List).GetProperty(“Item”,returnType:typeof(string),types:new[]{typeof(int)}),
参数:新[]{Expression.Constant(1)}
);
//生成项=>item.Address[1]。
表达式lambda=表达式.lambda(indexedAddress,param);
//谓词(item=>item.Address[1]==“Place”):
二进制表达式eq=表达式.Equal(indexedAddress,表达式.Constant(“Place”));
表达式predicateLambda=表达式.Lambda(等式,参数);
您可以按如下方式生成“动态查询”表达式(它不是真正的查询,它是一个简单的
成员表达式
):

ParameterExpression param = Expression.Parameter(typeof(Employee), "item");
MemberExpression address = Expression.Property(param, "Address");
BinaryExpression indexedAddress = Expression.ArrayIndex(address, Expression.Constant(1));
MemberExpression city = Expression.Property(indexedAddress, "City"); // Assuming "City" is a string.

// This will give us: item => item.Address[1].City
Expression<Func<Employee, string>> memberAccessLambda = Expression.Lambda<Func<Employee, string>>(city, param);
就代码而言:不确定为什么要创建一个lambda,其中委托类型是
Func
,而输入显然应该是
Employee
。参数类型必须始终与委托签名匹配

编辑

非数组索引器访问示例:

ParameterExpression param = Expression.Parameter(typeof(Employee), "item");
MemberExpression address = Expression.Property(param, "Address");

IndexExpression indexedAddress = Expression.MakeIndex(
    address,
    indexer: typeof(List<string>).GetProperty("Item", returnType: typeof(string), types: new[] { typeof(int) }),
    arguments: new[] { Expression.Constant(1) }
);

// Produces item => item.Address[1].
Expression<Func<Employee, string>> lambda = Expression.Lambda<Func<Employee, string>>(indexedAddress, param);

// Predicate (item => item.Address[1] == "Place"):
BinaryExpression eq = Expression.Equal(indexedAddress, Expression.Constant("Place"));
Expression<Func<Employee, bool>> predicateLambda = Expression.Lambda<Func<Employee, bool>>(eq, param);
ParameterExpression param=Expression.Parameter(typeof(Employee),“item”);
MemberExpression地址=Expression.Property(参数,“地址”);
IndexExpression indexedAddress=Expression.MakeIndex(
地址:,
索引器:typeof(List).GetProperty(“Item”,returnType:typeof(string),types:new[]{typeof(int)}),
参数:新[]{Expression.Constant(1)}
);
//生成项=>item.Address[1]。
表达式lambda=表达式.lambda(indexedAddress,param);
//谓词(item=>item.Address[1]==“Place”):
二进制表达式eq=表达式.Equal(indexedAddress,表达式.Constant(“Place”));
表达式predicateLambda=表达式.Lambda(等式,参数);

地址是索引器吗?如果它是一个数组,请使用
表达式.ArrayIndex
,如果它只是一个带有索引器的列表,请使用未索引的
表达式.Property
检索列表,然后对其
属性应用索引属性检索表达式。
地址
是索引器吗?如果它是一个数组,请使用
表达式.ArrayIndex
,如果它只是一个带有索引器的列表,请使用未索引的
表达式.Property
检索列表,然后在其
属性上应用索引属性检索表达式。感谢您的回复。要求上的细微变化。Address是Employee类中的列表属性。我收到以下错误“System.Core.dll中发生类型为'System.ArgumentException'的未处理异常”要求生成x.Address[1]=='Place'的查询。谢谢这是因为
ArrayIndex
只对数组(而不是列表)有效。我将修改我的代码,我希望您能够从中获得它(目前还不清楚您将使用
列表生成什么类型的谓词)。感谢您的澄清。修正。谢谢你的回复。要求上的细微变化。Address是Employee类中的列表属性。我收到以下错误“System.Core.dll中发生类型为'System.ArgumentException'的未处理异常”要求生成x.Address[1]=='Place'的查询。谢谢这是因为
ArrayIndex
只对数组(而不是列表)有效。我将修改我的代码,我希望您能够从中获得它(目前还不清楚您将使用
列表生成什么类型的谓词)。感谢您的澄清。修正。