C# 在nHibernate中选择不同的表

C# 在nHibernate中选择不同的表,c#,.net,sql,nhibernate,C#,.net,Sql,Nhibernate,我需要执行一个将返回N个表的查询。在我的程序中,我有以下表格(其中一些): 表: HM_接收 HM_SEND SM_接收 SM_SEND P_板 P_板_PDO 实体: HMreceive HMsend SMreceive SMsend 实验室 PSlabPDO 我有两个问题,如果我能用一个标准来完成,那就更好了: 如何选择所有表?首先,我相信并没有必要匹配ID,但若更改了任何我想知道的内容 是否有办法只选择HM和SM表,而忽略所有其他表 提前谢谢 编辑: 我是如何做的:从HMReceive

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

表:

  • HM_接收
  • HM_SEND
  • SM_接收
  • SM_SEND
  • P_板
  • P_板_PDO
  • 实体:

  • HMreceive
  • HMsend
  • SMreceive
  • SMsend
  • 实验室
  • PSlabPDO
  • 我有两个问题,如果我能用一个标准来完成,那就更好了:

  • 如何选择所有表?首先,我相信并没有必要匹配ID,但若更改了任何我想知道的内容
  • 是否有办法只选择HM和SM表,而忽略所有其他表
  • 提前谢谢

    编辑:


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

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

    如果您的表相互连接,则使用即时抓取。以下查询将获取子记录及其父记录:

    session.QueryOver<Child>().Fetch(child => child.Parent).Eager.List();
    
    session.QueryOver().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();
    
    //Future()返回一个惰性枚举,而不是实际查询数据库。
    var childs=session.QueryOver().Future();
    //NHibernate将在惰性枚举表被枚举后填充它,
    //或者当它必须访问数据库时,比如调用List()时:
    var parents=session.QueryOver().List();
    

    希望有帮助。

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

    如果您的表相互连接,则使用即时抓取。以下查询将获取子记录及其父记录:

    session.QueryOver<Child>().Fetch(child => child.Parent).Eager.List();
    
    session.QueryOver().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();
    
    //Future()返回一个惰性枚举,而不是实际查询数据库。
    var childs=session.QueryOver().Future();
    //NHibernate将在惰性枚举表被枚举后填充它,
    //或者当它必须访问数据库时,比如调用List()时:
    var parents=session.QueryOver().List();
    

    希望对您有所帮助。

    如果表具有类似的布局,您可以使用继承

    定义与以下类似的类:

    public class HMReceive : BaseClass
    
    
    public class HMSend : BaseClass
    
    
    public class SMReceive : BaseClass
    
    
    public class SMSend : BaseClass
    
    您可以使用HQL来

    select * from BaseClass
    

    或者使用条件查询基类。结果将是一个IList,但返回的每个实体将由实际类型HMReceive、HMSend、SMReceive或SMSend组成。

    如果表具有类似的布局,则可以使用继承

    定义与以下类似的类:

    public class HMReceive : BaseClass
    
    
    public class HMSend : BaseClass
    
    
    public class SMReceive : BaseClass
    
    
    public class SMSend : BaseClass
    
    您可以使用HQL来

    select * from BaseClass
    

    或者使用条件查询基类。结果将是一个IList,但返回的每个实体将由实际类型HMReceive、HMSend、SMReceive或SMSend组成。

    听起来您在寻求一种获取数据库中几乎所有数据的方法。你真的应该只获取你需要的数据。也就是说,有时能够从表中获取数据而不必显式命名要从中获取的表是很有用的。例如,您可能希望编写一个单元测试,以验证NHibernate映射是否与您的数据库模式正确匹配。阿耶恩德有一个朋友。这是该测试的稍微修改版本:

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

    我认为您可以使用类似于上面的循环作为您试图实现的目标的起点。我不打算实际发布一个获取数据库中所有数据的代码示例,因为我不想鼓励人们做坏事——但这应该足以让您开始。

    听起来您在寻求获取数据库中几乎所有数据的方法。你真的应该只获取你需要的数据。也就是说,有时能够从表中获取数据而不必显式命名要从中获取的表是很有用的。例如,您可能希望编写一个单元测试,以验证NHibernate映射是否与您的数据库模式正确匹配。阿耶恩德有一个朋友。这是该测试的稍微修改版本:

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

    我认为您可以使用类似于上面的循环作为您试图实现的目标的起点。我不打算实际发布一个获取数据库中所有数据的代码示例,因为我不想鼓励人们做坏事,但这应该足以让您开始。

    是的,不幸的是,我们使用的是Oracle。另一个问题(这将在我的第一篇文章中添加),对于nHibernate,我可以使用SQL进行自定义查询吗?我可以这样做:从HMReceive、SMReceive、HMSend、SMSend中选择*;谢谢。是的,不幸的是我们使用的是甲骨文。另一个问题(这将在我的第一篇文章中添加),对于nHibernate,我可以使用SQL进行自定义查询吗?我可以这样做:从HMReceive、SMReceive、HMSend、SMSend中选择*;谢谢。我看不出示例SQL查询,
    select*from HMRecieve,SMReceive,…
    ,是如何有用的。是否确实要将所有表交叉连接在一起?这将对性能非常不利-必须从数据库中获取大量重复数据。最好是为每个表分别发出查询。如果有另一种方法可以获得所有这4个表(尽可能简单),而无需为每个表设置条件,然后将所有表合并到一个LINQ中,我真的很想知道这一点