Start with the syntax QueryOver:
instanceIDs = new int[] { 1, 2, 3 };
EntityTypeDTO entityDTO = null;
CustomFieldDTO fieldDTO = null;
Field field = null;
IQueryOver<EntityType, Field> query = Session.QueryOver<EntityType>()
.Where(Restrictions.On<EntityType>(c => c.ID).IsIn(instanceIDs))
.JoinQueryOver<Field>(c => c.Fields, () => field)
.SelectList(list => list
.Select(c => c.ID)
.Select(c => c.Title)
.Select(() => field.ID)
.Select(() => field.Name)
)
.TransformUsing(new MyTransformer());
var dtos = query.List<EntityTypeDTO>();
QueryOver SQL, EntityTypes . EntityType
DTO ( QueryOver , ):
public class EntityTypeDTO
{
public virtual int ID { get; set; }
public virtual string Title { get; set; }
public virtual IList<CustomFieldDTO> Fields { get; set; }
...
}
public class CustomFieldDTO
{
public virtual int ID { get; set; }
public virtual string Name { get; set; }
...
}
, , MyTransformer():
public class MyTransformer : IResultTransformer
{
public object TransformTuple(object[] tuple, string[] aliases)
{
var entity = new EntityTypeDTO
{
ID = (int)tuple[0],
Title = tuple[1] as string
};
var field = new CustomFieldDTO
{
ID = (int)tuple[2],
Name = tuple[3] as string
};
entity.Fields = new List<CustomFieldDTO> { field };
return entity;
}
public System.Collections.IList TransformList(System.Collections.IList collection)
{
var results = new List<EntityTypeDTO>();
foreach(var item in collection)
{
var entity = item as EntityTypeDTO;
var existing = results.SingleOrDefault(c => c.ID.Equals(entity.ID));
if(existing != null)
{
existing.Fields.Add(entity.Fields.First());
continue;
}
results.Add(entity);
}
return results;
}
...
MyTransformer , ...