是否可以在NHibernate中执行此操作而不使用CreateSQLQuery?

时间:2009-12-19 22:55:09

标签: nhibernate

是否可以在NHibernate中执行此操作而不使用CreateSQLQuery。优选使用Linq To Nhibernate。最大的问题是如何在主键上进行连接?

SELECT DISTINCT calEvent.* From CalendarEvent as calEvent
LEFT JOIN UserChannelInteraction as channelInteraction on channelInteraction.ChannelToFollow_id = calEvent.Channel_id
LEFT JOIN UserCalendarEventInteraction as eventInteraction on eventInteraction.CalendarEvent_id = calEvent.Id
LEFT JOIN UserChannelInteraction as eventInteractionEvent on eventInteractionEvent.UserToFollow_id = eventInteraction.User_id
WHERE (calEvent.Channel_id = @intMainChannelID 
OR channelInteraction.User_id = @intUserID
OR eventInteraction.User_id = @intUserID
OR (eventInteractionEvent.User_id = @intUserID AND eventInteraction.Status = 'Accepted'))
AND calEvent.StartDateTime >= @dtStartDate 
AND calEvent.StartDateTime <= @dtEndDate
ORDER BY calEvent.StartDateTime asc

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

您可以使用Theta joins进行任意连接。 theta连接是笛卡尔积,因此它产生所有可能的组合,然后可以过滤。

在NHibernate中,您可以像这样(HQL)执行θ样式连接:

from Book b, Review r where b.Isbn = r.Isbn

然后,您可以添加所需的任何过滤条件,订购结果以及您可能想要执行的所有其他操作。

from Book b, Review r where b.Isbn = r.Isbn where b.Title = 'My Title' or r.Name = 'John Doe' order by b.Author asc

Here is an article关于theta加入Hibernate(不是NHibernate,但它仍然相关)。

但是,由于theta join是Cartesian产品,因此在使用该方法进行三连接查询之前,您可能需要三思而后行并进行一些性能测试。