sql从表达式树c#

本文关键字:表达式 sql | 更新日期: 2023-09-27 17:51:24

我基本上有一个称为DynamicServices的通用类。dynamicServices将如下所示

class DynamicEntityServices<T>{
     T GetById(Guid Id) { // get from db using ado.net dal 
     List<T> Search(SearchCondition searchCondition) { // filtering the data from the dal
}

现在,我有一个json规范文件[基本上是一个json模式文件,它定义了动态实体及其属性/类型

在运行时,我希望服务的消费者构建并向我发送一个搜索条件。

目前我的SQLDAL实现如下所示

class DynamicEntityDAL<T>{
    List<T> Search(SearchCondition condition){
      StringBuilder query = new StringBuilder();
      foreach(var field in condition.Fields){
         query.Append(" "+field.Key+" like '%"+field.Value+"%' ")

和上面类似的东西,我知道上面的过程是正确的,因为它有实际的限制。请注意,我希望在搜索条件中实际从动态服务的调用者那里获得一个表达式,然后我将像下面这样构造查询

var filterExpr = new Expression()...
var paramterExpr = new ParameterExpression("categorystatus",true); // not the right ones, but will look similar to this.
var condition = new SearchCondition{ SearchExpression = filterExpr };
In DAL, I can try to convert the above to SQL using some expression visitor like
`string filterClause = ConvertToSql(condition.SearchExpression);`

我可以读取和实现的东西,但我的json模式文件是动态的,我不能使用EF。请建议正确的方法,以便我的库可以从服务的调用者获得表达式,并将其转换为T-SQL并从db查询。

sql从表达式树c#

假设您有一段JSON,表示用户查询的WHERE子句的表达式,那么将其转换为SQL的步骤如下:

  1. 将JSON字符串转换为层次对象
  2. 将层次对象转换为SQL。

假设你已经完成了(1)(看起来你可以创建Expression’s,大概是从JSON),那么你只需要写一些递归地遍历Hierarchal对象并将其转换为SQL,这取决于Expression的类型。

您可能需要一些显式模式(表和列)的概念来动态计算您的JOIN,除非这些都在一个表/视图中。此外,如果模式的外键关系创建了一个循环图,那么除了表和列之外,还需要定义关系(这将帮助您指定哪种类型的连接,除非您可以假设INNER总是可以的)。当需要更改SELECT列和ORDER BY列时,这也将帮助您。

这是一个在过去多次写过类似内容的人说的话:

  • 这是非常耗时和不平凡的正确做;最好找一些已经做了足够类似于你想要的东西的东西,而不是从头开始写。
  • 利用尽可能多的现有框架,如果没有什么东西已经在那里为你工作。例如,重用Linq Expression s而不是滚动自己的,看起来你已经这样做了。

祝你好运!