Подзапрос для получения свойства NHibernate - PullRequest
0 голосов
/ 04 декабря 2010

Я использую NHibernate для веб-приложения.У меня есть такая модель:

public class ProductViewModel {
   public virtual int Id { get; set; }
   /* others simple properties */

   public virtual IList<OfferViewModel> LastOffers { get; set; }

   public ProductViewModel() { }
}
public class OfferViewModel {
   public virtual string UserName { get; set; }
   public virtual decimal Prince { get; set; }

   public OfferViewModel() { }
}

Я хотел бы знать, как получить свойство коллекции LastOffers с помощью подзапроса HQL?Я хочу получить его с топ 10 последних предложений.У меня правильно сопоставлена ​​модель, но я не знаю синтаксиса для выполнения подзапроса, извлекающего это свойство.

Сегодня я использую такую ​​команду для извлечения моей ViewModel:

public IList<ProductViewModel> GetProductsForSalles()
        {
            return
                Session.CreateQuery(@"select p.Id as Id, 
                                             p.Name as Name,
                                             p.Price as Price,
                                             p.Price as Date
                                             /* FETCH LastOffers? */
                                       from Product p  
                                       where p.Active=true and (p.Status=:Status)
                                       order by a.Date asc")
                    .SetParameter("Status", Status.Started)
                    .SetMaxResults(50)
                    .SetResultTransformer(Transformers.AliasToBean<ProductViewModel>())
                    .List<ProductViewModel>();
        }

Спасибо!

1 Ответ

1 голос
/ 04 декабря 2010

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

return Session.CreateCriteria(typeof(ProductViewModel), "p")
  .CreateCriteria("p.LastOffers", "lastoffers")
  .SetResultTransformer(new NHibernate.Transform.DistinctRootEntityResultTransformer())
  .Add(Restrictions.Eq("p.Active", true))
  .Add(Restrictions.Eq("p.Status", Status.Started))
  .SetMaxResults(50)
  .List<ProductViewModel>();

Не тесты, но идея в том, что мы объединяем две таблицы, и результат будет «свернут» для каждой строки продукта (DistinctRootEntityResultTransformer)

Извините, что пример не на HQL - я предпочитаю Criterias и QueryOver <> как более стабильные.

...