LINQ to NHibernate join - Запрос последнего N на группу - NotSupportedException - PullRequest
1 голос
/ 27 сентября 2019

Я пытаюсь получить последнее сообщение, отправленное каждому клиенту.Но я получаю 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();

System.NotSupportedException: запрос (запрос (select_from (из (диапазон App.Core.Customer m)) (выберите m)))

Сущности:

public class Communication
{
    public Message Message { get; set; }
    public Customer Customer { get; set; }
    ...
}

public class Message
{
    public DateTime CreatedOn { get; set; }
    public string Subject { get; set; }
    public string Body { get; set; }
    ...
}

Ответы [ 3 ]

2 голосов
/ 29 сентября 2019

Может кто-нибудь объяснить, что не так с моим запросом и почему я получаю эту ошибку?

NHibernate не поддерживает объединения в подзапросе.Это дает вам NotSupportedException.

У него также есть некоторые проблемы с групповыми подзапросами (подробнее см. Как запросить первую запись в каждой группе в NHibernate ).Но, используя последний метод, описанный в этом ответе, вы можете переписать ваш запрос примерно так:

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

0 голосов
/ 28 сентября 2019

Может быть, это то, что вы хотите сделать?

return _session
          .Query<Communication>()
          .GroupBy(e => e.Customer)
          .Select(g => new {Customer = g.Key, MaxDate = g.Max(r => r.Message.CreatedOn)})
          .ToList()
0 голосов
/ 27 сентября 2019

Я предполагаю, что Коммуникация похожа на поток из нескольких сообщений, а 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>();

Вам нужно будет заполнить < ... > всеми остальными столбцамив сообщении.Я думаю (я только посмотрел на посты в Интернете о том, как запустить сырой SQL в nH), что это выберет все последние Сообщения для каждого сообщения .. И, возможно, тогда обход по дереву объектов будет выглядеть как m.First().Communication.Customer.Name и т. Д.

т.е., надеюсь, из них вы можете присоединиться / перейти к Коммуникациям, получить Заказчика и т. Д. Я не знаю достаточно о необработанных запросах nH, чтобы знать, как получить его для формирования графа объектов, который включает в себя Коммуникацию в одном.нажмите, но вы могли бы использовать этот запрос:

  SELECT d.*
  FROM
    (SELECT *, ROW_NUMBER() OVER(PARTITION BY c.CustomerId ORDER BY CreatedOn DESC) rown FROM Messages m INNER JOIN Communication c ON m.CommunicationId = c.Id) d 
  WHERE d.rown = 1

Чтобы получить все последние сообщения для каждого клиента (немного отличается от последнего сообщения на одну связь, если один клиент имеет две одновременные связи), и объединить его с советом здесь , чтобы сделать результаты динамическими

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...