Sql 将自定义查询映射到nHibernate中的对象

Sql 将自定义查询映射到nHibernate中的对象,sql,nhibernate,Sql,Nhibernate,请看一看这个例子: () 假设我的结构具有以下定义: public class YourDto { public int YourDtoId { get; set; } public string YourDtoTitle { get; set; } public List<YourDtoBook> YourDtoList { get; set; } } 此查询的结果如下所示: select yourColumn1 as YourDtoId, yourCol

请看一看这个例子:

()

假设我的结构具有以下定义:

public class YourDto
{
    public int YourDtoId { get; set; }
    public string YourDtoTitle { get; set; }
    public List<YourDtoBook> YourDtoList { get; set; }
}
此查询的结果如下所示:

select yourColumn1 as YourDtoId, yourColumn2 as YourDtoTitle,
yourColumn3 as YourDtoList from YOUR_TABLE
YourDtoId| YourDtoTitle| YourDtoList
_____________________________________
1        |Jeff         | book1
1        |Jeff         | book2
2        |Kurt         | book3
2        |Kurt         | book4

如何正确映射这些实体?(即两个对象各有两个列表)

使用QueryOver和映射类使用Fetch-Eager

可使用GroupBy直接发送至DTO:

var result = yourNhSession.CreateSQLQuery(@"
                select yourColumn1 as YourDtoId, yourColumn2 as YourDtoTitle,
                yourColumn3 as YourDtoList from YOUR_TABLE")
                .List<object[]>()
                .GroupBy(x => new
                {
                    YourDtoId = (int) x[0],
                    YourDtoTitle = (string) x[1]
                })
                .Select(x => new YourDto
                {
                    YourDtoId = x.Key.YourDtoId,
                    YourDtoTitle = x.Key.YourDtoTitle,
                    YourDtoList = x.Select(y => new YourDtoBook
                    {
                        Name = (string)y[2]
                    }).ToList()
                });

    public class YourDto
    {
        public int YourDtoId { get; set; }
        public string YourDtoTitle { get; set; }
        public List<YourDtoBook> YourDtoList { get; set; }
    }

    public class YourDtoBook
    {
        public string Name { get; set; }
    }
var result=yourNhSession.CreateSQLQuery(@)
选择您的Column1作为您的数据对象,选择您的Column2作为您的数据主题,
您的专栏3作为您的“表格”中的数据列表)
.List()
.GroupBy(x=>new
{
YourDtoId=(int)x[0],
yourdotitle=(字符串)x[1]
})
.选择(x=>new YourDto
{
YourDtoId=x.Key.YourDtoId,
yourdotitle=x.Key.yourdotitle,
YourDtoList=x。选择(y=>newyourdtobook
{
Name=(字符串)y[2]
})托利斯先生()
});
公开课
{
public int YourDtoId{get;set;}
公共字符串yourdotitle{get;set;}
public List YourDtoList{get;set;}
}
公共类YourDtoBook
{
公共字符串名称{get;set;}
}

您可能需要发出两个单独的查询,一个用于获取“根”项,另一个用于获取相关列表