Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用NHibernate';s HQL使用多个内部联接进行查询_C#_.net_Nhibernate_Orm_Hql - Fatal编程技术网

C# 使用NHibernate';s HQL使用多个内部联接进行查询

C# 使用NHibernate';s HQL使用多个内部联接进行查询,c#,.net,nhibernate,orm,hql,C#,.net,Nhibernate,Orm,Hql,这里的问题包括将用LINQ到SQL语法编写的语句转换为NHibernate的等效语句。LINQ to SQL代码如下所示: var whatevervar = from threads in context.THREADs join threadposts in context.THREADPOSTs on threads.thread_id equals threadposts.thre

这里的问题包括将用LINQ到SQL语法编写的语句转换为NHibernate的等效语句。LINQ to SQL代码如下所示:

var whatevervar = from threads in context.THREADs
                          join threadposts in context.THREADPOSTs
                            on threads.thread_id equals threadposts.thread_id
                          join posts1 in context.POSTs
                            on threadposts.post_id equals posts1.post_id
                          join users in context.USERs
                            on posts1.user_id equals users.user_id
                          orderby posts1.post_time
                          where threads.thread_id == int.Parse(id)
                          select new
                          {
                              threads.thread_topic,
                              posts1.post_time,
                              users.user_display_name,
                              users.user_signature,
                              users.user_avatar,
                              posts1.post_body,
                              posts1.post_topic
                          };
它本质上是试图在给定的论坛线程中获取帖子列表。我(在本网站有帮助的用户的帮助下)能为NHibernate想出的最好办法是:

var whatevervar = session.CreateQuery("select t.Thread_topic, p.Post_time, " +
                                              "u.User_display_name, u.User_signature, " +
                                              "u.User_avatar, p.Post_body, p.Post_topic " +
                                              "from THREADPOST tp " +
                                              "inner join tp.Thread_ as t " +
                                              "inner join tp.Post_ as p " +
                                              "inner join p.User_ as u " +
                                              "where tp.Thread_ = :what")
                                              .SetParameter<THREAD>("what", threadid)
                                              .SetResultTransformer(Transformers.AliasToBean(typeof(MyDTO)))
                                              .List<MyDTO>();
我已经没有主意了,虽然通过直接SQL查询来实现这一点是可能的,但我希望能够正确地实现这一点,而不会破坏使用ORM的目的

提前谢谢

编辑:


数据库如下所示:(还不能发布图像。)

当我希望HQL查询返回自定义类型时,就像您一样,我总是这样做:

select new MyDTO (t.Thread_Topic, p.Post_time, u.User_Display_Name, .... ) 
from ...
我必须检查我的一些代码,但我认为在这种情况下我甚至不使用AliasToBeenTransformer。 我不太清楚,因为我主要使用NHibernate的ICriteria API(当使用这个API时,在执行此类操作时确实需要指定resulttransformer)


注意:我发现在属性名中看到下划线很奇怪(或者相当尴尬)…

HQL是对对象的查询,而不是对表的查询

在HQL中,我看到类tp和该类的属性tp.Thread\之间的连接。您应该在这里区分SQL和HQL。将HQL视为对对象TP的查询,而不是对底层表结构的查询。您能发布您的域模型(对象之间的关系)以便我们可以帮助您吗

谢谢你的照片。但是:看起来您的对象是表的副本,我不认为这就是您的想法?例如:我本以为线程和帖子之间的多对多关系应该使用Hibernate进行映射。如果是这样的话,您可以将线程与post连接起来,而不必麻烦处理中间对象threadpost,它实际上只是保存这些对象之间的关系,对吗

换言之;使用帖子列表装饰线程对象,并使用线程列表装饰帖子对象

[装饰]
也就是说,将线程列表作为属性放在post类上,并将帖子列表作为属性放在threads类上。您需要的是nhibernate映射文件的多对多关系。这意味着您不需要映射类中的多对多表,只需映射post和thread类的关系。

奇怪的名称是由NConstruct-Lite生成的XML产生的,我使用它生成ORM文件等等。主键从“smth_id”更改为“id”,外键从“smth_id”更改为“smth_id”。我不知道NHibernate的HQL在没有中间表的情况下能够实现这种关系——我知道,如果不指出THREADPOST持有线程和POST之间的关联,我无法在常规SQL中实现这一点。我不知道你说的“装饰”是什么意思。你能解释一下吗?他所说的装饰是指除了直接表属性之外,还要向实体类添加更多内容。因此,一个用户有多个帖子,所以将IList添加到您的用户类中,等等。
select new MyDTO (t.Thread_Topic, p.Post_time, u.User_Display_Name, .... ) 
from ...