如何通过流畅的nhibernate传递sub Select * to Join

时间:2014-07-11 13:14:03

标签: sql nhibernate fluent-nhibernate

NH能否创建像

这样的JOIN SELECT查询
 Select * From table1 Join ( Select * From table2 ...? 

为什么他不能。

在我的任务中,我有一个简单的表格:

TABLE [Message](
  [Id] [int] NOT NULL,  
  [DocId] [int] NOT NULL,
  [RecipientId] [bigint] NOT NULL,
  [Text] [nvarchar](255) NULL,
  [ArrivalDate] [date] NOT NULL

选择:

SELECT msg.*
FROM [Message] msg
JOIN( SELECT msgMaxForDoc.DocId, MAX(msgMaxForDoc.ArrivalDate) AS ArrivalDate
      FROM [Message] msgMaxForDoc
      GROUP BY msgMaxForDoc.DocId) docAndDate ON msg.DocId = docAndDate.DocId AND msg.ArrivalDate = docAndDate.ArrivalDate
WHERE msg.RecipientId = @UserId

完整任务听起来像:“为用户选择所有消息。如果文档(由DocId表示)包含多条消息,则获取最新消息”。结果我必须为UserId

限制的所有DocId选择一条最新消息

我在这里发现了类似的问题: nhibernate queryover join with subquery to get aggregate column 但它没有帮助(我没有任何链接到另一个平板电脑DocId只是数字)。

这里Join a Subquery with NHibernate(但我不能将选择分为两部分......)

1 个答案:

答案 0 :(得分:0)

据我所知,使用NHibernate加入子查询是不可能的。但是,您可以使用“WHERE EXISTS”方法实现目标:

var dCriteria = DetachedCriteria.For<Message>("grouped")
.SetProjection(Projections.GroupProperty("grouped.DocId"))
.SetProjection(Projections.Max("grouped.ArrivalDate"))
.Add(Restrictions.EqProperty("msg.DocId", "grouped.DocId"))
.Add(Restrictions.EqProperty("msg.ArrivalDate", "grouped.ArrivalDate"))
.Add(Restrictions.Eq("grouped.RecipientId", @UserId));

var userMessages = Session.CreateCriteria<Message>("msg")
.Add(Subqueries.Exists(dCriteria)).List<Message>();