2013-09-11 52 views
0

我需要執行一個將返回N個表格的查詢。在我的計劃,我有如下表(其中一些):在nHibernate中選擇不同的表格

表:

  1. HM_RECEIVE;
  2. HM_SEND;
  3. SM_RECEIVE;
  4. SM_SEND;
  5. P_SLAB;
  6. P_SLAB_PDO;
  7. ...

實體:

  1. HMreceive;
  2. HMsend;
  3. SMreceive;
  4. SMsend;
  5. PSlab;
  6. PSlabPDO;
  7. ...

我有兩個問題,而這將只使用一個標準是,如果我能完成它更好:

  1. 如何選擇所有表?在第一時間我相信沒有必要匹配身份證,但如果改變了我真正想知道的任何事情,
  2. 有沒有辦法只選擇HM和SM表,忽略所有其他的?

在此先感謝。

編輯:

我怎麼做這樣的事情:從HMReceive,SMReceive,HMSend,SMSend選擇*?

+0

我無法看到示例SQL查詢「select * from HMRecieve,SMReceive,....」如何有用。你真的想把所有的桌子交叉在一起嗎?這對性能來說是非常糟糕的 - 必須從數據庫中提取大量重複數據。對每個表格分別發出查詢會更好。 –

+0

如果還有另一種方法來獲得所有這4個表格(儘可能簡單),沒有每個表格的標準,然後加入所有在一個LINQ中,我真的很想知道它。 –

回答

1

如果表格具有相似的佈局,則可以使用繼承。

定義類似於類:

public class HMReceive : BaseClass 


public class HMSend : BaseClass 


public class SMReceive : BaseClass 


public class SMSend : BaseClass 

,您可以使用HQL來

select * from BaseClass 

或使用標準對查詢BaseClass的。結果將是一個IList,但返回的每個實體將由實際類型HMReceive,HMSend,SMReceive或SMSend組成。

+0

謝謝。我開發了另一種方式,但它與此非常相似。我創建了另一個實體,只有我要使用的列。但我使用.CreateSQLQuery()的HQL所以...感謝提示。 –

+0

這個答案不完全正確。這裏有兩種可能性: 如果BaseClass也被映射,那麼select一定會一次處理所有相關的表。 如果未映射BaseClass,則NHibernate將爲BaseClass的每個映射的子類生成一個SELECT。 –

1

我不是很確定自己的需求,但使用NHibernate,有幾種方法可以在單個查詢來獲取多張表:

使用,如果你的表相互連接渴望獲取。下面的查詢將與父母一起取子記錄:

session.QueryOver<Child>().Fetch(child => child.Parent).Eager.List(); 

如果表不相互連接,和你的數據庫是Oracle,那麼你的運氣了。但隨着MS SQL Server,您可以使用未來的()進行多次查詢去數據庫一次:

// Future() returns a lazy enumerable, not actually queries the database. 
var childs = session.QueryOver<Child>().Future(); 
// NHibernate will populate the lazy enumerable once it being enumerated, 
// or when it has to hit the database anyway, like when a call to List() happen: 
var parents =session.QueryOver<Parent>().List(); 

希望這有助於。

+0

是的,不幸的是我們正在使用Oracle。 另一個問題(這將添加到我的第一篇文章),與nHibernate我可以使用SQL進行自定義查詢? 我可以這樣做: select * from HMReceive,SMReceive,HMSend,SMSend; 謝謝。 –

1

這聽起來像是你要求一種方法來獲取數據庫中幾乎所有的數據。你真的應該只抓取你需要的數據。也就是說,有時能夠從表中獲取數據而不必明確命名要從中獲取的表是有用的。例如,您可能希望編寫一個單元測試,以驗證NHibernate映射是否與您的數據庫模式正確匹配。 Ayende有一個blog post illustrating how to write such a test。這是該測試的一個稍微修改版本:

[Test] 
public void SchemaShouldMatchMappings() 
{ 
    // `GetAllClassMetadata` returns a collection of all of the mapped entities. 
    foreach (var entry in _sessionFactory.GetAllClassMetadata()) 
    { 
     // Build a query that fetches this entity... 
     _session.CreateCriteria(entry.Value.EntityName) 
      // ... but tell it to just check the schema and not actually bring any back. 
      .SetMaxResults(0) 
      // Execute the query. 
      .List(); 
    } 
} 

我認爲你可以使用類似於上面的循環作爲你試圖完成的一個起點。我不會真的發佈一個代碼示例來獲取數據庫中的所有數據,因爲我不想鼓勵人們做壞事 - 但這應該足以讓你開始。

+0

謝謝你的幫助@Daniel Schilling,但我找到了另一種方法來使它工作。但我喜歡你的實現,一旦我完成了這一點,我想我會嘗試它。 –