C# 用动态对象构建表达式树的方法

C# 用动态对象构建表达式树的方法,c#,linq,dynamic,expression-trees,C#,Linq,Dynamic,Expression Trees,我正在寻求有关如何处理一个有趣问题的帮助 我们有一些代码将构建表达式树(LINQ)来搜索/排序/分页强类型对象的集合。表达式树代码使用反射来构建表达式树,并将使用任意集合(只要它是强类型的) IEnumerable解析(请求-请求,IQueryable-queryableData),其中T:class //请求包含搜索/排序/分页条件,例如:FuzzySearch:“FindAnyObjectWithThis” 我们最近请求能够自定义搜索/排序的字段。基本上,用户可以动态选择要包括/排除的列。

我正在寻求有关如何处理一个有趣问题的帮助

我们有一些代码将构建表达式树(LINQ)来搜索/排序/分页强类型对象的集合。表达式树代码使用反射来构建表达式树,并将使用任意集合(只要它是强类型的)

IEnumerable解析(请求-请求,IQueryable-queryableData),其中T:class
//请求包含搜索/排序/分页条件,例如:FuzzySearch:“FindAnyObjectWithThis”
我们最近请求能够自定义搜索/排序的字段。基本上,用户可以动态选择要包括/排除的列。为了实现这一点,我们开始使用动态对象(ExpandoObject),但这破坏了解析功能,因为没有可供反射使用的底层类型

  • 我们可以将解析更改为使用DynamicLinq解析集合,但这需要我们更改解析函数

  • 我们可以尝试动态构建一个类型,并在检索原始数据时实例化该类型,但这可能会很慢

  • 一种我们没有想到的方法


  • 还有其他人做过类似的事情吗?您是如何做到这一点的?

    当您动态地做每件事时,这是一个非常明显的迹象,表明您根本不应该使用LINQ。它是专门为编译时已知的数据模式设计的。几乎可以肯定的是,您最好使用更传统的查询形式,这些查询从一开始就被设计为动态的。我应该提到,解析函数并不严格限于此功能,它在其他地方使用。您所指的是什么其他传统表单?构建SQL字符串。您还假设底层数据都是SQL。数据来自几个不同的来源(Web服务、SQL等),这就是为什么我说您应该使用更传统的非LINQ方法来涵盖所有这些情况。我怀疑你使用的任何东西都只能用LINQ来完成。使用LINQ成为选项之前的任何机制。
    IEnumerable<T> Parse<T>(Request request, IQueryable<T> queryableData) where T: class
    // Request Contains the searching/sorting/pagination criteria eg: FuzzySearch: "FindAnyObjectWithThis"