[英]sql from expression trees C#
我基本上有一个称为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的步骤:
假设您已经完成了(1)(似乎可以从JSON创建Expression
的对象),那么您只需要编写一些内容即可,就可以根据Expression
的类型递归地遍历Hierarchal对象并将其转换为SQL。 。
您可能需要在某个地方需要一些显式架构(表和列)的概念来动态计算您的JOIN
,除非全部都在一个表/视图中。 另外,如果您架构的外键关系创建了一个循环图,那么除了表和列之外,您还需要定义关系(这将帮助您指定哪种连接类型,除非您可以假设INNER
总是可以的)。 当/如果需要更改SELECT列和ORDER BY列时,这也将为您提供帮助。
这来自过去多次写过类似文章的人:
Expression
而不是自己滚动,看起来已经完成了。 祝好运!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.