NHibernate - наиболее лаконичный способ выбора нескольких столбцов с помощью QueryOver.

1

С Linq вы можете легко сделать:

from c in session.Query<Site>()
       select new {c.SiteName, c.SiteId, 
                   c.Network, c.RegionLocation.City, 
                   c.RegionLocation.Region.RegionName};

Есть ли способ сделать что-то подобное с QueryOver? Кажется, что вы можете сделать это с помощью SelectList но это не кажется таким же чистым, как подход linq. Есть ли более чистый способ?

Теги:
nhibernate
queryover

1 ответ

6

Нет, насколько я знаю, это немного более многословный, чем Линк. Но разве это не чистота?

session.QueryOver<Sites>()
        .SelectList(x => x
          .Select(p => p.Name)
          .Select(p => p.Lat)
          .Select(p => p.Lng)
        )
        .TransformUsing(Transformers.AliasToBean<MarkerDto>())  
        .List<MarkerDto>();  

public class MarkerDto  
{  
  public string Name { get; set; }  
  public decimal? Lat { get; set; }  
  public decimal? Lng { get; set; }  
} 

Если ваш список избранных разделен для нескольких запросов, вы можете попытаться оставаться сухими с помощью projectionBuilder например

Func<QueryOverProjectionBuilder<MarkerDto>, 
    QueryOverProjectionBuilder<MarkerDto>> GetDtoList() {
    MarkerDto dto = null;
    return list => list
      .Select(w => w.Name).WithAlias(() => dto.Name)
      .Select(w => w.Lat).WithAlias(() => dto.Lat)
      .Select(w => w.Lng).WithAlias(() => dto.Lng);
}

и использовать как

Session.QueryOver<Sites>()  
    .SelectList(GetDtoList())  
    .TransformUsing(Transformers.AliasToBean<MarkerDto>())  
    .List<MarkerDto>();  

Немного чище, но более громоздко, создавая projectionBuilder, однако зачем менять Linq, если он работает для вас?

Я должен также упомянуть, что можно создать трансформатор, который превращается в анонимный тип, см. Этот пост в блоге, отказ от ответственности!

  • 0
    Приятно! Может быть, потому что это чисто ... изменить с Linq на QueryOver;)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню