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