是否可以在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
答案 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产品,因此在使用该方法进行三连接查询之前,您可能需要三思而后行并进行一些性能测试。