C# LINQ到NHibernate连接-查询每个组的最新N-不支持异常

C# LINQ到NHibernate连接-查询每个组的最新N-不支持异常,c#,linq,nhibernate,C#,Linq,Nhibernate,我正在尝试将最后一条消息发送给每位客户。但是我得到了一个没有任何额外细节的NotSupportedException。我不熟悉LINQ到NHibernate的连接方法,因为这是第一次使用它。有人能解释一下我的查询出了什么问题以及为什么会出现这个错误吗?以下是我的查询和错误: var messages = _session.Query<Communication>(); return messages.Join( _session.Query

我正在尝试将最后一条消息发送给每位客户。但是我得到了一个没有任何额外细节的NotSupportedException。我不熟悉LINQ到NHibernate的连接方法,因为这是第一次使用它。有人能解释一下我的查询出了什么问题以及为什么会出现这个错误吗?以下是我的查询和错误:

var messages = _session.Query<Communication>();     

return messages.Join(
                _session.Query<Communication>().GroupBy(m => m.Customer),
                x => new { x.Customer, x.Message.CreatedOn },
                g => new { Customer= g.Key, CreatedOn = g.Max(p => p.Message.CreatedOn) },
                (x, g) => x)
                .ToList();

我假设一个通信就像一个包含多条消息的线程,CustomerId存在于通信级别,然后消息有一个CommunicationId和一个CreatedOn。我并不声称能够提供nHibernate/LINQ语法,但您可以使用原始SQL:

var m = _session.CreateSQLQuery(@"

  SELECT m.Id, m.CommunicationId, m.CreatedOn, m.<put a list of all other columns in messages here>
  FROM
    (SELECT *, ROW_NUMBER() OVER(PARTITION BY CommunicationId ORDER BY CreatedOn DESC) rown FROM Messages) m 
  WHERE m.rown = 1")
.AddEntity(typeof(Message))
.List<Message>();

要获取每个客户的所有最新消息(与每个通信的最新消息略有不同,如果一个客户同时有两个通信),并将其与建议结合起来,使结果成为动态的,可能这就是您想要做的

return _session
          .Query<Communication>()
          .GroupBy(e => e.Customer)
          .Select(g => new {Customer = g.Key, MaxDate = g.Max(r => r.Message.CreatedOn)})
          .ToList()
return\u会话
.Query()
.GroupBy(e=>e.Customer)
.Select(g=>new{Customer=g.Key,MaxDate=g.Max(r=>r.Message.CreatedOn)})
托利斯先生()
有人能解释一下我的查询出了什么问题以及为什么会出现这个错误吗

NHibernate不支持子查询上的联接。这将为您提供
NotSupportedException

它在按子查询分组时也存在一些问题(有关详细信息,请参阅)。但使用本答案中描述的最后一种技术,您可以将查询重写为以下内容:

var results = session.Query<Communication>()
        .Where(c => c == session.Query<Communication>()
                            .Where(cs => cs.Customer == c.Customer)
                            .OrderByDescending(cs => cs.Message.CreatedOn)
                            .First()
        ).ToList();

var results=session.Query()
.Where(c=>c==session.Query()
.Where(cs=>cs.Customer==c.Customer)
.OrderByDescending(cs=>cs.Message.CreatedOn)
.First()
).ToList();

您使用什么RDBMS?Microsoft SQL Server 2017感谢您的帮助。我希望不用sql查询就可以做到这一点。该消息无法识别通信。我已经用实体更新了我的问题。
return _session
          .Query<Communication>()
          .GroupBy(e => e.Customer)
          .Select(g => new {Customer = g.Key, MaxDate = g.Max(r => r.Message.CreatedOn)})
          .ToList()
var results = session.Query<Communication>()
        .Where(c => c == session.Query<Communication>()
                            .Where(cs => cs.Customer == c.Customer)
                            .OrderByDescending(cs => cs.Message.CreatedOn)
                            .First()
        ).ToList();