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查询。
假设您有一段JSON,表示用户查询的WHERE
子句的表达式,那么将其转换为SQL的步骤如下:
- 将JSON字符串转换为层次对象
- 将层次对象转换为SQL。
假设你已经完成了(1)(看起来你可以创建Expression
’s,大概是从JSON),那么你只需要写一些递归地遍历Hierarchal对象并将其转换为SQL,这取决于Expression
的类型。
您可能需要一些显式模式(表和列)的概念来动态计算您的JOIN
,除非这些都在一个表/视图中。此外,如果模式的外键关系创建了一个循环图,那么除了表和列之外,还需要定义关系(这将帮助您指定哪种类型的连接,除非您可以假设INNER
总是可以的)。当需要更改SELECT列和ORDER BY列时,这也将帮助您。
这是一个在过去多次写过类似内容的人说的话:
- 这是非常耗时和不平凡的正确做;最好找一些已经做了足够类似于你想要的东西的东西,而不是从头开始写。
- 利用尽可能多的现有框架,如果没有什么东西已经在那里为你工作。例如,重用Linq
Expression
s而不是滚动自己的,看起来你已经这样做了。
祝你好运!