2013-04-21 42 views
0

我有以下查詢這對我的作品:添加動態SQL查詢來QueryOver

IList<info> result = 
QueryOver<info>() 
.Where(row => row.Timestamp >= fromDate) 
.And(row => row.Timestamp <= toDate) 
.OrderBy(row => row.Timestamp).Asc 
.Skip(startRow).Take(count).List(); 

我需要從客戶端的另外SQL查詢字符串獲取並將其添加到我的查詢,如下所示,以擴展它:

IList<info> result = 
     QueryOver<info>() 
     .Where(row => row.Timestamp >= fromDate) 
     .And(queryString) 
     .And(row => row.Timestamp <= toDate) 
     .OrderBy(row => row.Timestamp).Asc 
     .Skip(startRow).Take(count).List(); 

string queryString = "AND name='haim' And number=1" 

是否有可能添加QueryOver動態查詢字符串?

+0

你爲什麼要這樣做? – Phill 2013-04-21 10:09:07

回答

0

我懷疑這是可能的開箱即用。但有一些調整,你可以做到這一點

  1. 獲取您的QueryOver<> SQL中。按照接受的答案this question
  2. 將此連接到您的客戶端發送的sql
  3. 使用NH運行普通SQL。請參閱接受的答案this question如何做到這一點
0

我會在這裏添加,這是不是一個很好的做法,以生成其他地方的SQL併發送它執行。我知道在類中抽象WHERE場景可能很困難,但使用NET4處理動態類要快得多。

所以我說這是不好的做法,因爲你沒有在單層封裝你的查詢。你應該。

糟糕的後果顯然是兩部分之間缺乏強有力的關係,導致這是一個非常脆弱的解決方案。如果更改,您需要知道其他需要更新,等等。一兩個開發團隊可以,但是大團隊會因此受到傷害。

只是我的兩分錢。

0

簡短的回答是,你可以:

string queryString = "name='haim' And number=1"; 
var query = Session.QueryOver<info>().And(NHibernate.Criterion.Expression.Sql(queryString)); 

只要你不斷注入的查詢字符串短期和簡單,你都會好的。 如果你想讓這個注入的字符串也改變查詢語義(例如需要一個連接),我會建議反對它;這是不值得的麻煩。