Запрос на ссылку HasMany

У меня есть модель сущности:

public class Request { public virtual IList Responses { get; set; } } public class Response { public virtual DateTime Timestamp { get; set; } public virtual bool Success { get; set; } } 

Я пытаюсь создать запрос , который даст мне весь запрос, где его последний ответ (относительно его метки времени ) является достаточным . Как это может быть сделано?

Как всегда, NHibernate действительно отвечает за это. То, что мы здесь пытаемся достичь, было бы выражением SQL Statement следующим образом:

 // final Request selection SELECT request.[RequestId] FROM [Request] request // Only requests, which are successful, and have Max(date) WHERE request.[RequestId] IN ( SELECT successResponse.RequestId as y0_ FROM [Response] successResponse // response which max date is equal to the upper response // and which RequestId corresponds with supper upper Request WHERE EXISTS ( SELECT maxResponse.RequestId as y0_ , max(maxResponse.[DateTime]) as y1_ FROM [Response] maxResponse // do the MAX only for current Request WHERE maxResponse.RequestId = successResponse.RequestId GROUP BY maxResponse.RequestId // assure that the Response match is on the max DateTime HAVING max(maxResponse.[DateTime]) = successResponse.[DateTime] ) AND successResponse.[Success] = 1 ) 

Заметки:

  1. Ожидание ответа имеет RequestId
  2. выше был использован C # // комментарий вместо SQL --

И теперь волшебство NHibernate и QueryOver:

 // This declaration will allow us, to use a reference from middle SELECT // in the most deeper SELECT Response response = null; // the most INNER SELECT var maxSubquery = QueryOver.Of() .SelectList(l => l .SelectGroup(item => item.RequestId) .SelectMax(item => item.DateTime) ) // WHERE Clause .Where(item => item.RequestId == response.RequestId) // HAVING Clause .Where(Restrictions.EqProperty( Projections.Max(item => item.DateTime), Projections.Property(() => response.DateTime) )); // the middle SELECT var successSubquery = QueryOver.Of(() => response) // to filter the Request .Select(res => res.RequestId) .WithSubquery .WhereExists(maxSubquery) // now only these wich are successful .Where(success => success.Success == true) ; 

В этот момент мы имеем внутренние SUB SELECT, вложенные. давайте использовать их:

 // the most outer SELECT var query = session.QueryOver(); query.WithSubquery // our Request ID is IN(... .WhereProperty(r => r.ID) .In(successSubquery); var list = query .List(); 

Заключительные замечания, я не обсуждаю эту концепцию. Не производительность. Я бы использовал скорее настройку ответа «IsActive» и упростил бы это … это всего лишь ответ, как это сделать …

Я возьму на это удар, вот какой-то linq (вместо этого вместо Query ).

 session.Query() .Where(request => request.Responses.Count() > 0 && request.Responses.OrderByDescending(response => response.Timestamp) .First() .Success); 

Не знаю, работает ли это.

  • NHibernate: Как мне XmlSerialize ISet ?
  • Список против набора против сумки в NHibernate
  • Идентификация прокси-classов NHibernate
  • Как реализовать Единицу работы, которая работает с EF и NHibernate
  • Лучший способ сохранить упорядоченный список в базе данных, сохраняя порядок
  • Как просмотреть SQL, сгенерированный nHibernate?
  • Как вы сопоставляете enum как значение int с белым NHibernate?
  • Как удалить дочерний объект в NHibernate?
  • Получить отличительный результат из NHibernate с помощью API критериев?
  • Критерии.DISTINCT_ROOT_ENTITY против Projections.distinct
  • Синтаксис для определения фильтра NHibernate с Fluent Nhibernate?
  • Interesting Posts

    Android: Как установить уровень масштабирования вида карты в радиусе 1 км вокруг моего текущего местоположения?

    Сопоставление двух целых чисел с единым, уникальным и детерминированным образом

    Самый легкий способ запустить приложение Google Hangouts Chrome на Mac

    Как определить, меняет ли текст TextBlock?

    ВЕРНУТЬСЯ ВЕРСИЯ В LINQ

    Что такое переадресация портов и для чего она используется?

    Почему GCC, скомпилированный программой C, нуждается в разделе .eh_frame?

    jquery $ (window) .height () возвращает высоту документа

    Забытый оператор присваивания «=» и банальность »: =”

    Как обновить / обновить с углового 4 до углового 5+

    Как программно удалить SMS из папки «Входящие» на Android?

    Разница между подписанным / unsigned char

    Как нарисовать изображение над другим изображением?

    @ Андроидный дисплей / res / viewable в WebView

    Удалите защищенные предупреждения (_CRT_SECURE_NO_WARNINGS) из проектов по умолчанию в Visual Studio

    Давайте будем гением компьютера.