在nHibernate中选择不同的表

时间:2013-09-11 00:32:40

标签: c# .net sql nhibernate

我需要执行一个返回N个表的查询。在我的程序中,我有以下表格(其中一些):

TABLES:

  1. HM_RECEIVE;
  2. HM_SEND;
  3. SM_RECEIVE;
  4. SM_SEND;
  5. P_SLAB;
  6. P_SLAB_PDO;
  7. ...
  8. 实体:

    1. HMreceive;
    2. HMsend;
    3. SMreceive;
    4. SMsend;
    5. PSlab;
    6. PSlabPDO;
    7. ...
    8. 我有两个问题,如果我只用一个标准来完成它就会更好:

      1. 如何选择所有表格?在第一时刻,我相信没有必要匹配ID,但如果有任何改变,我真的想知道;
      2. 有没有办法只选择HM和SM表,忽略所有其他表?
      3. 提前致谢。

        修改

        我是如何做的:从HMReceive,SMReceive,HMSend,SMSend中选择*?

3 个答案:

答案 0 :(得分:1)

我不太确定你的要求,但是使用NHibernate,有几种方法可以在一个查询中获取多个表:

如果您的表彼此连接,请使用急切提取。以下查询将获取子记录及其父级:

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

如果这些表没有相互连接,并且您的数据库是Oracle,那么您就不走运了。但是使用MS SQL Server,您可以使用Future()一次多次查询数据库:

// 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();

希望得到这个帮助。

答案 1 :(得分: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。

答案 2 :(得分:1)

听起来你正在寻找一种方法来获取数据库中的几乎所有数据。你真的应该只获取你需要的数据。也就是说,有时能够从表中获取数据而不必明确命名要从中获取的表是有用的。例如,您可能希望编写一个单元测试,它只是验证NHibernate映射是否与您的数据库模式正确匹配。艾恩德有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();
    }
}

我认为你可以使用类似于上面的循环作为你想要完成的事情的起点。我不打算发布一个代码示例来获取数据库中的所有数据,因为我不想鼓励人们做坏事 - 但这应该足以让你开始。