在复杂场景中使用NHibernate QueryOver

在复杂场景中使用NHibernate QueryOver,nhibernate,queryover,Nhibernate,Queryover,我试图在该场景中使用QueryOver: public class Class1 { public virtual string Name { get; set; } public virtual string Descripton { get; set; } public virtual Class2 { get; set; } public virtual IList<Class3> ListClass3{ get; set; } ...

我试图在该场景中使用QueryOver:

public class Class1
{
    public virtual string Name { get; set; }
    public virtual string Descripton { get; set; }
    public virtual Class2 { get; set; }
    public virtual IList<Class3> ListClass3{ get; set; }
    ... //SEVERAL OTHERS LISTS, PROPERTIES
}

 public class Class2
{
    public virtual string Name { get; set; }
    ... //SEVERAL OTHERS LISTS, PROPERTIES
}


public class Class3
{
    public virtual string Name { get; set; }
    public virtual Class4 { get; set; }
    ... //SEVERAL OTHERS LISTS, PROPERTIES
}

public class Class4
{
    public virtual string Prop1 { get; set; }
    public virtual string Prop2{ get; set; }
    ... //SEVERAL OTHERS LISTS, PROPERTIES
}
公共类1
{
公共虚拟字符串名称{get;set;}
公共虚拟字符串描述符{get;set;}
公共虚拟类2{get;set;}
公共虚拟IList ListClass3{get;set;}
…//其他几个列表、属性
}
公共课2
{
公共虚拟字符串名称{get;set;}
…//其他几个列表、属性
}
公共班级3
{
公共虚拟字符串名称{get;set;}
公共虚拟类4{get;set;}
…//其他几个列表、属性
}
公共班级4
{
公共虚拟字符串Prop1{get;set;}
公共虚拟字符串Prop2{get;set;}
…//其他几个列表、属性
}
我的DTO:

public class ClassDTO
{
    public string NameClass1 { get; set; }
    public string DescriptonClass1 { get; set; }
    public string NameClass2 { get; set; }

    public virtual IList<Class3> Class3List { get; set; }       
}
公共类ClassDTO
{
公共字符串名称Class1{get;set;}
公共字符串描述符CLASS1{get;set;}
公共字符串NameClass2{get;set;}
公共虚拟IList Class3List{get;set;}
}
我的问题是如何获得IList。。。如果没有这一点,到目前为止效果很好:

Class2 class2 = null;
IList<Class3> listClass3 = null;
var queryOver = Session.QueryOver<clsClass1>();

var list =  queryOver
            .JoinAlias(x => x.Class2, () => class2)
            .JoinAlias(x => x.ListClass3, () => listClass3, JoinType.LeftOuterJoin)
            .SelectList(list => list                
              .Select(c2 => c2.Name).WithAlias(() => myDTO.NameClass1)
              .Select(c2 => class2.Name).WithAlias(() => myDTO.NameClass2)
              //NEED GET LIST<CLASS3>
             )
       .TransformUsing(Transformers.AliasToBean<ClassDTO>())
            .List<ClassDTO>();
Class2 Class2=null;
IList listClass3=null;
var queryOver=Session.queryOver();
var list=queryOver
.JoinAlias(x=>x.Class2,()=>Class2)
.JoinAlias(x=>x.ListClass3,()=>ListClass3,JoinType.LeftOuterJoin)
.SelectList(list=>list
.Select(c2=>c2.Name).WithAlias(()=>myDTO.nameclas1)
.Select(c2=>class2.Name).WithAlias(()=>myDTO.NameClass2)
//需要获取列表
)
.TransformUsing(Transformers.AliasToBean())
.List();
这很好,但我现在需要“填充”IList。。。如果可能的话,只需从第4类中获取Prop1和Prop2


谢谢你,这是你想要的一次往返

// get ClassDTOs
Class2 class2 = null;
ClassDTO myDTO = null;
var results = Session.QueryOver<Class1>()
    .JoinAlias(x => x.Class2, () => class2)
    .SelectList(list => list                
        .Select(c1 => c1.Id).WithAlias(() => myDTO.IdClass1)
        .Select(c1 => c1.Name).WithAlias(() => myDTO.NameClass1)
        .Select(c1 => c1.Description).WithAlias(() => myDTO.DescriptionClass1)
        .Select(() => class2.Name).WithAlias(() => myDTO.NameClass2)
    )
    .TransformUsing(Transformers.AliasToBean<ClassDTO>())
    .Future<ClassDTO>();

// get Class3DTOs
Class3 class3 = null;
Class3DTO myClass3DTO = null;
var subresults = Session.QueryOver<Class1>()
    .JoinAlias(x => x.Class3List , () => class3)
    .JoinAlias(() => classe3.Class4 , () => class4)
    .SelectList(list => list                
        .Select(c => c.Id)
        .Select(() => class3.Name)
        .Select(() => class4.Prop1)
        .Select(() => class4.Prop2))
    .Future<object[]>()
    .ToLookup(array => (int)array[0], array => new myClass3DTO
    {
        NameClass3 = (string)array[1],
        Prop1Class4 = (string)array[2],
        Prop2Class4 = (string)array[3],
    });

// assigne the lists to the dto
foreach (var result in results)
{
    result.ListClass3 = subresults[result.IdClass1].ToList();
}

return results;
//获取classdto
Class2 Class2=null;
ClassDTO myDTO=null;
var results=Session.QueryOver()
.JoinAlias(x=>x.Class2,()=>Class2)
.SelectList(list=>list
.Select(c1=>c1.Id).WithAlias(()=>myDTO.IdClass1)
.Select(c1=>c1.Name).WithAlias(()=>myDTO.nameclas1)
.Select(c1=>c1.Description).WithAlias(()=>myDTO.DescriptionClass1)
。选择(()=>class2.Name)。使用别名(()=>myDTO.NameClass2)
)
.TransformUsing(Transformers.AliasToBean())
.Future();
//获取Class3DTOs
Class3 Class3=null;
Class3DTO myClass3DTO=null;
var subresults=Session.QueryOver()
.JoinAlias(x=>x.Class3List,()=>class3)
.JoinAlias(()=>classe3.Class4,()=>Class4)
.SelectList(list=>list
.选择(c=>c.Id)
.选择(()=>class3.Name)
.选择(()=>class4.Prop1)
.选择(()=>class4.Prop2))
.Future()
.ToLookup(数组=>(int)数组[0],数组=>新myClass3DTO
{
NameClass3=(字符串)数组[1],
Prop1Class4=(字符串)数组[2],
Prop2Class4=(字符串)数组[3],
});
//将列表分配给dto
foreach(结果中的var结果)
{
result.ListClass3=子结果[result.IdClass1].ToList();
}
返回结果;

接近你想要的东西,只需一次往返

// get ClassDTOs
Class2 class2 = null;
ClassDTO myDTO = null;
var results = Session.QueryOver<Class1>()
    .JoinAlias(x => x.Class2, () => class2)
    .SelectList(list => list                
        .Select(c1 => c1.Id).WithAlias(() => myDTO.IdClass1)
        .Select(c1 => c1.Name).WithAlias(() => myDTO.NameClass1)
        .Select(c1 => c1.Description).WithAlias(() => myDTO.DescriptionClass1)
        .Select(() => class2.Name).WithAlias(() => myDTO.NameClass2)
    )
    .TransformUsing(Transformers.AliasToBean<ClassDTO>())
    .Future<ClassDTO>();

// get Class3DTOs
Class3 class3 = null;
Class3DTO myClass3DTO = null;
var subresults = Session.QueryOver<Class1>()
    .JoinAlias(x => x.Class3List , () => class3)
    .JoinAlias(() => classe3.Class4 , () => class4)
    .SelectList(list => list                
        .Select(c => c.Id)
        .Select(() => class3.Name)
        .Select(() => class4.Prop1)
        .Select(() => class4.Prop2))
    .Future<object[]>()
    .ToLookup(array => (int)array[0], array => new myClass3DTO
    {
        NameClass3 = (string)array[1],
        Prop1Class4 = (string)array[2],
        Prop2Class4 = (string)array[3],
    });

// assigne the lists to the dto
foreach (var result in results)
{
    result.ListClass3 = subresults[result.IdClass1].ToList();
}

return results;
//获取classdto
Class2 Class2=null;
ClassDTO myDTO=null;
var results=Session.QueryOver()
.JoinAlias(x=>x.Class2,()=>Class2)
.SelectList(list=>list
.Select(c1=>c1.Id).WithAlias(()=>myDTO.IdClass1)
.Select(c1=>c1.Name).WithAlias(()=>myDTO.nameclas1)
.Select(c1=>c1.Description).WithAlias(()=>myDTO.DescriptionClass1)
。选择(()=>class2.Name)。使用别名(()=>myDTO.NameClass2)
)
.TransformUsing(Transformers.AliasToBean())
.Future();
//获取Class3DTOs
Class3 Class3=null;
Class3DTO myClass3DTO=null;
var subresults=Session.QueryOver()
.JoinAlias(x=>x.Class3List,()=>class3)
.JoinAlias(()=>classe3.Class4,()=>Class4)
.SelectList(list=>list
.选择(c=>c.Id)
.选择(()=>class3.Name)
.选择(()=>class4.Prop1)
.选择(()=>class4.Prop2))
.Future()
.ToLookup(数组=>(int)数组[0],数组=>新myClass3DTO
{
NameClass3=(字符串)数组[1],
Prop1Class4=(字符串)数组[2],
Prop2Class4=(字符串)数组[3],
});
//将列表分配给dto
foreach(结果中的var结果)
{
result.ListClass3=子结果[result.IdClass1].ToList();
}
返回结果;

QueryOver直接翻译成SQL。您无法编写SQL查询来选择具有父属性的子列表,因此QueryOver也无法执行此操作。在这种情况下,您必须编写两个查询。QueryOver直接转换为SQL。您无法编写SQL查询来选择具有父属性的子列表,因此QueryOver也无法执行此操作。在这种情况下,您必须编写两个查询。谢谢Firo。。。但是我在select>.select(c=>c.Id,()=>class3.Name,()=>class4.Prop1,()=>class4.Prop2)上出现了语法错误,似乎我不能在select中混合使用无arg和arg操作。编辑过汉克斯·菲罗。。。但是我在select>.select(c=>c.Id,()=>class3.Name,()=>class4.Prop1,()=>class4.Prop2)上出现了语法错误,似乎我不能在select中混合使用无arg和arg操作。编辑