0

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

表格:

  1. HM_RECEIVE;
  2. HM_发送;
  3. SM_RECEIVE;
  4. SM_发送;
  5. P_SLAB;
  6. P_SLAB_PDO;
  7. ...

实体:

  1. HM接收;
  2. HM发送;
  3. SM接收;
  4. 短信发送;
  5. 实验室;
  6. PSlabPDO;
  7. ...

我有两个问题,如果我可以只使用一个标准来完成它会更好:

  1. 如何选择所有表?一开始我相信没有必要匹配 ID,但如果改变了我真正想知道的任何东西;
  2. 有没有办法只选择 HM 和 SM 表,而忽略所有其他表?

提前致谢。

编辑:

我该怎么做:从 HMReceive、SMReceive、HMSend、SMSend 中选择 *?

4

3 回答 3

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

希望这有帮助。

于 2013-09-11T04:06:54.593 回答
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。

于 2013-09-11T13:59:46.963 回答
1

听起来您正在寻求一种获取数据库中几乎所有数据的方法。你真的应该只获取你需要的数据。也就是说,有时能够从表中获取数据而不必显式命名要从中获取的表是很有用的。例如,您可能想要编写一个单元测试来简单地验证 NHibernate 映射是否正确匹配您的数据库模式。Ayende 有一篇博文说明如何编写这样的测试。这是该测试的略微修改版本:

[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();
    }
}

我认为您可以使用与上述类似的循环作为您要完成的工作的起点。我不会实际发布一个获取数据库中所有数据的代码示例,因为我不想鼓励人们做坏事——但这应该足以让你开始。

于 2013-09-11T14:07:44.180 回答