Использование 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; }
    ... //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
}

И мой ДТО:

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; }       
}

Моя проблема в том, как получить 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>();

Это работает нормально, но мне нужно "заполнить" IList сейчас... И, если возможно, получить только Prop1 и Prop2 из Class4...

Спасибо


person Paul    schedule 08.03.2012    source источник
comment
QueryOver транслируется непосредственно в SQL. Вы не можете написать SQL-запрос для выбора дочернего списка с родительскими свойствами, поэтому QueryOver также не сможет этого сделать. В этом случае вам придется написать два запроса.   -  person Andrew Whitaker    schedule 08.03.2012


Ответы (1)


что-то близкое к тому, что вы хотите совершить за один рейс туда и обратно

// 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;
person Firo    schedule 09.03.2012
comment
Спасибо Фиро... Но я получил синтаксическую ошибку при выборе › .Select(c => c.Id, () => class3.Name, () => class4.Prop1, () => class4.Prop2) - person Paul; 09.03.2012
comment
кажется, я не могу смешивать действия arg и arg в Select. отредактировал - person Firo; 09.03.2012