C#学习教程:使用表达式树的动态查询从许多表中提取数据。我想避免编写排序和搜索每个表的每个字段。这就是为什么我想使用表达式树。我想动态构建查询。我想编写一个泛型方法,它会根据用户输入为select、where和orderby方法生成表达式树。我可以使用System.Reflection获取正在查询的类型(我所有的表都是类型-我正在使用LinqToSql)。我不知道如何形成表达式树。到目前为止,这是我所拥有的:privatestaticListGetSortedData(stringsortColumnName){vartype=typeof(T);varproperty=type.GetProperty(sortColumnName);varparameter=Expression.Parameter(type,"p");varpropertyAccess=Expression.MakeMemberAccess(参数,属性);varorderByExp=Expression.Lambda(propertyAccess,参数);MethodCallExpressionresultExp=Expression.Call(typeof(Queryable),"OrderBy",newType[]{type,property.PropertyType},WHAT_SHOULD_BE_HERE,Expression.Quote(orderByExp));返回(List)Expression.Lambda(resultExp).Compile().DynamicInvoke();}如何使用表达式树动态实现select、sort和orderby?你所拥有的是亲密的。如果您问“WHAT_SHOULD_BE_HERE”,您会好奇OrderBy的“源”参数使用什么表达式,当用作扩展方法时,它通常隐含在操作数中。您需要做的是更改您的示例以对IQueryable进行操作,并且您需要接受它作为输入参数。此外,将WHAT_SHOULD_BE_HERE占位符替换为“list.Expression”,如下所示。privatestaticIEnumerableGetSortedData(IQueryablelist,stringsortColumnName){vartype=typeof(T);varproperty=type.GetProperty(sortColumnName);varparameter=Expression.Parameter(type,"p");varpropertyAccess=Expression.Property(参数,属性);varorderByExp=Expression.Lambda(propertyAccess,参数);MethodCallExpressionresultExp=Expression.Call(typeof(Queryable),"OrderBy",new[]{type,property.PropertyType},list.Expression,Expression.Quote(orderByExp));返回(IEnumerable)Expression.Lambda(resultExp).Compile().DynamicInvoke();我用下面的代码测试了这个:staticvoidMain(string[]args){varlist=newList(new[]{newPerson{FirstName="John"},newPerson{FirstName="Jane"}}).AsQueryable();foreach(varoinGetSortedData(list,"FirstName"))Console.WriteLine(o.FirstName);}publicclassPerson{publicstringFirstName{get;放;打印出:JaneJohn我在Orderby上遇到了同样的错误。查看Call方法,发现少了参数-list.Expression,其中list是你的IQuerable更多C#学习教程,希望大家多多关注—本文收集自网络,不代表个人观点位置。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
