2016-06-26 92 views
0

我基本上有一個名爲DynamicServices的泛型類。該dynamicServices將類似於以下從表達式樹C#

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並從數據庫中查詢。

+1

如果您只關心如何從標準Expression Tress生成SQL,那麼[此答案](http://stackoverflow.com/a/7933938/3745022)將對您有用。如果您想知道如何從未指定的JSON創建表達式樹,那麼您應該提供更多詳細信息 - 對於可以手動創建表達式樹的簡單查詢,但是如果您的JSON表示更復雜的事情,那麼這將是一項不重要的任務。 –

回答

1

假設你已經一塊JSON的,它表示與用戶查詢的一個WHERE子句表達,然後在這裏被轉換到該SQL的步驟:

  1. 轉換JSON字符串到的層級對象。
  2. 將Hierarchal對象轉換爲SQL。

假設你已經(1)完成(它看起來像你可以創建Expression的,大概是從JSON),那麼你只需要寫一些東西,遞歸遍歷所述分層對象,並將其轉換爲SQL,取決於Expression的類型。

您可能需要一些顯式模式(表和列)的概念來動態計算您的JOIN,除非它們全部在一個表/視圖中。此外,如果模式的外鍵關係創建循環圖,則除了表和列之外,還需要定義關係(除非您可以假設INNER始終可以,否則將幫助您指定哪種類型的連接)。當你想要改變SELECT列和ORDER BY列時,這也會對你有所幫助。

這是從誰已經多次寫入類似的事情在過去有人來了:

  • 這是非常耗時和不平凡做正確;最好找到一些已經足夠類似於你想要的東西,而不是從頭開始寫。
  • 儘可能多地利用現有的框架,如果沒有爲您工作的東西。例如,重複使用Linq Expression而不是滾動你自己的,看起來你已經這樣做了。

祝你好運!