我需要执行一个返回N个表的查询。在我的程序中,我有以下表格(其中一些):
TABLES:
实体:
我有两个问题,如果我只用一个标准来完成它就会更好:
提前致谢。
修改
我是如何做的:从HMReceive,SMReceive,HMSend,SMSend中选择*?
答案 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();
}
}
我认为你可以使用类似于上面的循环作为你想要完成的事情的起点。我不打算发布一个代码示例来获取数据库中的所有数据,因为我不想鼓励人们做坏事 - 但这应该足以让你开始。