C# 动态数据-为列表实现IQueryable<;int>;包含()
我有一系列对象,它们都有一个类似的属性,即它们所属组的ID列表(每个孩子有许多父对象) 我在编程实现Linq表达式时遇到了问题,这是使该过滤器正常工作所必需的 这就是我到目前为止所做的:C# 动态数据-为列表实现IQueryable<;int>;包含(),c#,asp.net,dynamic-data,linq-expressions,C#,Asp.net,Dynamic Data,Linq Expressions,我有一系列对象,它们都有一个类似的属性,即它们所属组的ID列表(每个孩子有许多父对象) 我在编程实现Linq表达式时遇到了问题,这是使该过滤器正常工作所必需的 这就是我到目前为止所做的: IQueryable result = null; if (!string.IsNullOrWhiteSpace(this.ddlRouteNames.SelectedValue)) { ConstantExpression ce = Expression.Constant(int.P
IQueryable result = null;
if (!string.IsNullOrWhiteSpace(this.ddlRouteNames.SelectedValue))
{
ConstantExpression ce = Expression.Constant(int.Parse(this.ddlRouteNames.SelectedValue));
ParameterExpression pe = Expression.Parameter(source.ElementType);
MemberExpression me = Expression.Property(pe, this.Column.Name);
MethodCallExpression mce = Expression.Call(typeof(List<int>), "Contains", new[] { typeof(int) }, me, ce);
result = source.Provider.CreateQuery(mce);
}
return result;
IQueryable结果=null;
如果(!string.IsNullOrWhiteSpace(this.ddlRouteNames.SelectedValue))
{
ConstantExpression ce=Expression.Constant(int.Parse(this.ddlRouteNames.SelectedValue));
ParameterExpression pe=Expression.Parameter(source.ElementType);
MemberExpression me=Expression.Property(pe,this.Column.Name);
MethodCallExpression mce=Expression.Call(typeof(List),“Contains”,new[]{typeof(int)},me,ce);
结果=source.Provider.CreateQuery(mce);
}
返回结果;
尝试创建MethodCallExpression时出现异常:
类型“System.Collections.Generic.List`1[System.Int32]”上不存在“Contains”方法
关于从何处开始的任何指针?在您使用的方法签名中键入
:
public static MethodCallExpression Call(Type type,
string methodName,
Type[] typeArguments,
params Expression[] arguments);
指定包含特定静态方法的类型
您需要此方法的类型实例可用-示例(与您的注释相关):
<代码> var PAR =表达式。参数(Type of(int),PAR);
var inst=表达式参数(typeof(List),“inst”);
var body=Expression.Call(inst,typeof(List).GetMethod(“Contains”),par);
var exp=表达式λ(阀体、仪表、零件);
var deleg=exp.Compile();
var lst=newlist(){1,2,3,4,5};
var exists=deleg.DynamicInvoke(lst,3);
您的方法调用不正确,要调用非静态方法,您需要提供包含该方法的实例。下面是包含方法调用的示例:
var list = new List<int> {1};
//Target for invoke method
var target = Expression.Constant(list);
var methodCallExpression = Expression.Call(target, typeof(List<int>).GetMethod("Contains"), Expression.Constant(1));
我很困惑,您的回答几乎正确。在这个问题中,方法是静态的。当我尝试创建查询时,其他问题会导致异常:“参数表达式不实现System.Linq.IQueryable`1[System.Boolean]”。谢谢。我是否可以使用类似的方法来达到预期的效果?基本上,我正在尝试编写一个表达式,以查看所选Id是否出现在该对象的Id列表中。越来越近。。。MethodCallExpression部分现在似乎工作正常,但当我尝试使用IQueryable源代码创建查询时,出现了以下异常:“参数表达式未实现System.Linq.IQueryable`1[System.Boolean]”。“什么类型的source
变量?source是传递到GetQueryable方法中的IQueryable,从QueryableFilterUserControl的继承中重写。
var list = new List<int> {1};
//Target for invoke method
var target = Expression.Constant(list);
var methodCallExpression = Expression.Call(target, typeof(List<int>).GetMethod("Contains"), Expression.Constant(1));
Expression.Call(me, typeof(List<int>).GetMethod("Contains"), ce);