С 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. Есть ли более чистый способ?
Нет, насколько я знаю, это немного более многословный, чем Линк. Но разве это не чистота?
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, если он работает для вас?
Я должен также упомянуть, что можно создать трансформатор, который превращается в анонимный тип, см. Этот пост в блоге, отказ от ответственности!