2013-09-11 22 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,但我找到了另一种方法来使它工作。但我喜欢你的实现,一旦我完成了这一点,我想我会尝试它。 –