NHibernate - 使用QueryOver选择多个列的最简洁方法

时间:2014-05-23 09:13:20

标签: c# nhibernate queryover

使用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那样干净。有更清洁的方式吗?

1 个答案:

答案 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,免责声明!