使用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那样干净。有更清洁的方式吗?
答案 0 :(得分:6)
不,据我所知,它比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?
我还应该提一下,可以创建一个转换为匿名类型的转换器,请参阅blog post,免责声明!