【问题标题】:How to pass sub Select * to Join by fluent nhibernate如何通过流利的nhibernate通过sub Select *加入
【发布时间】:2014-07-11 13:14:03
【问题描述】:

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(但我不能将选择分成两部分......)

【问题讨论】:

    标签: sql nhibernate fluent-nhibernate


    【解决方案1】:

    据我所知,使用 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>();
    

    【讨论】:

      猜你喜欢
      • 2018-12-13
      • 2013-02-12
      • 2010-11-17
      • 1970-01-01
      • 1970-01-01
      • 2012-02-02
      • 2017-08-13
      • 2012-01-04
      • 1970-01-01
      相关资源
      最近更新 更多