dan*_*0ne 3 c# nhibernate dto queryover
我有两个实体(商店和城市),我需要用两个实体的一些值填充DTO:
商店实体:
public class Shop
{
public virtual int Id {get;set;}
public virtual string Name {get;set;}
public virtual string Address {get;set;}
public virtual int CityId {get;set;}
public virtual City City {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
城市实体:
public class City
{
public virtual int Id {get;set;}
public virtual string NameES {get;set;}
public virtual string NameEN {get;set;}
public virtual string NameIT {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
DTO课程:
public class MyDTO
{
public virtual int Id {get;set;}
public virtual string Name {get;set;}
public virtual string CityName {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
我想知道是否有任何方法可以使用QueryOver进行下一个SQL查询(请注意,来自商店的City子项可以为null):
Sesion.CreateSQLQuery("SELECT s.id as Id, s.name as Name, IF(ISNULL(c.NameES),'---', c.NameES) as CityName from shop as s left join city c on c.Id = s.cityId").SetResultTransformer(Transformers.AliasToBean(typeof(MyDTO)))
.List<MyDTO>())
Run Code Online (Sandbox Code Playgroud)
解决方案可能是这样的:
// these will server as fully-type representatives, and aliases
Shop shop = null;
City city = null;
MyDTO dto = null;
// shop query
var query = session.QueryOver<Shop>(() => shop);
// if needed a reference to criteria of the city
var cityPart = query.JoinQueryOver(() => shop.City // reference
, () => city // alias
, JoinType.LeftOuterJoin); // left join
// SELECT Clause
query.SelectList(list => list
.Select(() => shop.Id)
.WithAlias(() => dto.Id)
.Select(() => shop.Name)
.WithAlias(() => dto.Name)
// Conditional here
.Select(Projections.Conditional(
Restrictions.Where(() => city.NameES== null),
Projections.Constant("---", NHibernateUtil.String),
Projections.Property(() => city.NameES)
))
.WithAlias(() => dto.NameEs)
);
var result = query
.TransformUsing(Transformers.AliasToBean<MyDTO>())
.List<MyDTO>();
Run Code Online (Sandbox Code Playgroud)