簡體   English   中英

獲取每個組的最后N個元素

[英]Get last N elements for each group

我想做的是為表中的每個分組獲取最后的N個元素(對於我的示例3)。 我的桌子是:

create table application_sessions
(
    application_session_id int identity(1,1) primary key,
    session_type_id int not null references session_types(session_type_id),
    start_ts datetime not null,
    end_ts datetime null,
    is_successful bit not null default 0
)

在這種情況下,我試圖為每個session_type_id獲取表中的最后3個條目(按start_ts排序)。 為此,我將運行以下命令:

;with ranking as
(
    select *, row_number() over (partition by session_type_id order by start_ts desc) as rn
    from application_sessions
)
select * from ranking
where rn <= 3

我在使用NHibernate以這種方式從數據庫中獲取這些記錄時遇到了一些問題。 給定下面的實體(SessionType是枚舉),這樣做的最佳方法是什么?

public class ApplicationSession
{
    public virtual int Id { get; set; }
    public virtual SessionType SessionType { get; set; }
    public virtual DateTime StartTimestamp { get; set; }
    public virtual DateTime? EndTimestamp { get; set; }
    public virtual bool IsSuccessful { get; set; }
}

我(失敗)的第一次嘗試是:

public IList<ApplicationSession> GetLastNGroupedSessions(int count)
  {
     return _session.Query<ApplicationSession>()
                       .GroupBy(x => x.SessionType)
                       .SelectMany(y =>
                               y.OrderByDescending(z => z.StartTimestamp)
                                .Take(count))
                       .ToList();
   }

這產生異常:無法識別查詢源:ItemName = y,ItemType = System.Linq.IGrouping`2 [RIMS.ECMS.BusinessObjects.Local.Models.SessionType,RIMS.ECMS.BusinessObjects.Local.Models.ApplicationSession] ,表達式=來自{值(NHibernate.Linq.NhQueryable`1 [RIMS.ECMS.BusinessObjects.Local.Models.ApplicationSession])=> GroupBy([x] .SessionType,[x])}中IGrouping`2 y

因此,它可能不是“最佳”解決方案,但它是可行的解決方案。 我的一位同事指出,NHibernate允許您使用CreateSQLQuery直接執行SQL。 這是我想出的解決方案,以防萬一其他人遇到此類問題。

  public IList<ApplicationSession> GetLastNGroupedSessions(int count)
  {

     var sqlQuery = string.Format(@";with ranking as
     (
     select *, row_number() over (partition by session_type_id order by start_ts desc) as rn
     from application_sessions
     )
     select app.application_session_id,
        app.session_type_id,
        app.start_ts,
        app.end_ts,
        app.is_successful 
     from ranking as app
     where rn <= {0}", count);

     return _session.CreateSQLQuery(sqlQuery)
        .AddEntity("app", typeof(ApplicationSession))
        .List<ApplicationSession>();
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM