2011-05-07 13 views
12

quiero usar consulta sobre que me devuelva un objetoCómo "Select" con queryover nhibernate

public class TaskMap : ClassMap<Task> 
    { 
     public TaskMap() 
     { 
      Table("Tasks"); 
      Id(x => x.TaskId); 
      Map(x => x.TaskName).NvarcharWithMaxSize().Not.Nullable(); 
      Map(x => x.Description).NvarcharWithMaxSize(); 
      Map(x => x.DueDate).Not.Nullable(); 
      HasMany(x => x.PersonalTaskReminders).Inverse(); 
      HasMany(x => x.TaskReminders).Inverse(); 
      References(x => x.Course).Not.Nullable(); 
      HasMany(x => x.CompletedTasks); 

     } 
    } 



[Serializable()] 
public class Task 
{ 
    public virtual int TaskId { get; private set; } 
    public virtual string TaskName { get; set; } 
    public virtual string Description { get; set; } 
    public virtual DateTime DueDate { get; set; } 
    public virtual IList<PersonalTaskReminder> PersonalTaskReminders { get; set; } 
    public virtual IList<TaskReminder> TaskReminders { get; set; } 
    public virtual IList<CompletedTask> CompletedTasks { get; set; } 
    public virtual Course Course { get; set; } 

    public Task() 
    { 
     PersonalTaskReminders = new List<PersonalTaskReminder>(); 
     TaskReminders = new List<TaskReminder>(); 
     CompletedTasks = new List<CompletedTask>(); 
    } 

} 
    public class PlannerTask 
{ 
    public int TaskId { get; set; } 
    public string TaskName { get; set; } 
    public string Description { get; set; } 
    public DateTime DueDate { get; set; } 
    public List<PersonalTaskReminder> PersonalTaskReminders { get; set; } 
    public List<TaskReminder> TaskReminders { get; set; } 
    public Course Course { get; set; } 
    public bool IsCompleted { get; set; } 


} 

Trate 1

Task tAlias = null; 
     PlannerTask plannerTask = null; 
     List<PlannerTask> result = session.QueryOver<Task>(() => tAlias) 
      .Select(x => x.Course).TransformUsing(Transformers.AliasToBean<PlannerTask>())    
      .List<PlannerTask>().ToList(); 

Resultados: 188 registros con toda nula para el curso objeto.

2 TRY

Task tAlias = null; 
      PlannerTask plannerTask = null; 
      List<PlannerTask> result = session.QueryOver<Task>(() => tAlias) 
         .Select(Projections.Property(() => tAlias.TaskId).WithAlias(() => plannerTask.TaskId), 
         Projections.Property(() => tAlias.TaskName).WithAlias(() => plannerTask.TaskName), 
         Projections.Property(() => tAlias.DueDate).WithAlias(() => plannerTask.DueDate), 
         Projections.Property(() => tAlias.Description).WithAlias(() => plannerTask.Description), 
         Projections.Property(() => tAlias.PersonalTaskReminders).WithAlias(() => plannerTask.PersonalTaskReminders), 
         Projections.Property(() => tAlias.TaskReminders).WithAlias(() => plannerTask.PersonalTaskReminders), 
         Projections.Property(() => tAlias.Course).WithAlias(() => plannerTask.Course)) 
       .TransformUsing(Transformers.AliasToBean<PlannerTask>())    
       .List<PlannerTask>().ToList(); 

Resultados: 188 cursos con todas las propiedades que tiene más o menos el mismo error

'((new System.Collections.Generic.Mscorlib_CollectionDebugView<Domain.PlannerTask>(result)).Items[0].Course).CoursePermissions' threw an exception of type 'NHibernate.ObjectNotFoundException' 

Trate 3

Task tAlias = null; 
     PlannerTask plannerTask = null; 
     List<PlannerTask> result = session.QueryOver<Task>(() => tAlias) 
      .Select(Projections.Property(() => tAlias.TaskId).WithAlias(() => plannerTask.TaskId), 
      Projections.Property(() => tAlias.TaskName).WithAlias(() => plannerTask.TaskName), 
      Projections.Property(() => tAlias.DueDate).WithAlias(() => plannerTask.DueDate), 
      Projections.Property(() => tAlias.Description).WithAlias(() => plannerTask.Description), 
      Projections.ProjectionList().Add(Projections.Property(()=> tAlias.PersonalTaskReminders).WithAlias(() => plannerTask.PersonalTaskReminders)), 
      Projections.ProjectionList().Add(Projections.Property(()=> tAlias.TaskReminders).WithAlias(() => plannerTask.PersonalTaskReminders)), 
      Projections.Property(() => tAlias.Course).WithAlias(() => plannerTask.Course)) 
      .TransformUsing(Transformers.AliasToBean<PlannerTask>())    
      .List<PlannerTask>().ToList(); 


SELECT this_.TaskId  as y0_, 
     this_.TaskName as y1_, 
     this_.DueDate  as y2_, 
     this_.Description as y3_, 
     this_.TaskId  as y4_, 
     this_.TaskId  as y4_, 
     this_.CourseId as y4_ 
FROM Tasks this_ 

Resultado:

CoursePermissions = '((Castle.Proxies.CourseProxy)((new System.Collections.Generic.Mscorlib_CollectionDebugView<PlannerTask>(result)).Items[0].Course)).CoursePermissions' threw an exception of type 'NHibernate.ObjectNotFoundException' 

intentan 4

Trate 4

Task tAlias = null; 
     PlannerTask plannerTask = null; 
     List<PlannerTask> result = session.QueryOver<Task>(() => tAlias) 
      .Select(Projections.Property(() => tAlias.TaskId).WithAlias(() => plannerTask.TaskId), 
      Projections.Property(() => tAlias.TaskName).WithAlias(() => plannerTask.TaskName), 
      Projections.Property(() => tAlias.DueDate).WithAlias(() => plannerTask.DueDate), 
      Projections.Property(() => tAlias.Description).WithAlias(() => plannerTask.Description), 
      Projections.Property(() => tAlias.Course).WithAlias(() => plannerTask.Course)) 
      .TransformUsing(Transformers.AliasToBean<PlannerTask>())    
      .List<PlannerTask>().ToList(); 


SELECT this_.TaskId  as y0_, 
     this_.TaskName as y1_, 
     this_.DueDate  as y2_, 
     this_.Description as y3_, 
     this_.CourseId as y4_ 
FROM Tasks this_ 

Works. Puedo acceder a todo en el objeto del curso.

Parece tener un problema con

tAlias.PersonalTaskReminders y tAlias.TaskReminders. Si elimino este curso, se procesará correctamente.

No entiendo por qué.

+0

No es muy claro lo que quiere hacer. –

+0

@Mauricio Scheffer: estoy intentando hacer una selección que coloca los resultados en una colección de objetos PlannerTask, pero el objeto del curso en cada uno de los objetos PlannerTask arroja una excepción. – chobo2

+0

¿Puedes publicar el SQL generado para Try 4 y Try 3? – Vadim

Respuesta

23

Creo que el problema es que está intentando proyectar objetos proxy del curso. Las proyecciones son para objetos planos de transferencia de datos. Puede declarar las propiedades del curso que necesita para esta vista.

public class PlannerTask 
{ 
    public int TaskId { get; set; } 
    public string TaskName { get; set; } 
    public string Description { get; set; } 
    public DateTime DueDate { get; set; } 
    //flatten Course object 
    public int CourseId { get; set; } 
    public int CourseName { get; set; } 
    public bool IsCompleted { get; set; } 
} 

La lista de selección se puede simplificar un poco ...

PlannerTask plannerTask = null; 
Course courseAlias = null; 

List<PlannerTask> result = session.QueryOver<Task>() 
    .JoinAlias(x => x.Course,() => courseAlias) 
    .SelectList(list => list 
     .Select(x => x.TaskId).WithAlias(() => plannerTask.TaskId) 
     .Select(x => x.TaskName).WithAlias(() => plannerTask.TaskName) 
     .Select(x => x.DueDate).WithAlias(() => plannerTask.DueDate) 
     .Select(x => x.Description).WithAlias(() => plannerTask.Description) 
     .Select(x => x.Course.Id).WithAlias(() => plannerTask.CourseId)) 
     .Select(x => courseAlias.Name).WithAlias(() => plannerTask.CourseName)) 
    .TransformUsing(Transformers.AliasToBean<PlannerTask>())    
    .List<PlannerTask>(); 
+0

No estoy seguro de qué es el objeto proxy, pero ¿por qué se proyectaría adecuadamente si solo tengo "Course" y no "PersonalTaskReminders/TaskReminders pero cuando agrego esos 2 falla?" – chobo2

+0

No se puede proyectar un objeto mapeado como 'Course '. Cuando tratas de hacer eso, te queda este tipo de objeto proxy zombied que arroja' NHibernate.ObjectNotFoundException' cuando accedes a las propiedades cargadas perezosas. – dotjoe

+0

Entiendo que si no fuera por el hecho de que "Try 4 "Funciona. Entonces, ¿por qué puede hacerlo cuando dejo fuera esos esos otros 2 objetos asignados (PersonalTaskReminders/TaskReminders). Si" Try 4 "no funcionó, tendría sentido, pero como funciona me confunde. – chobo2

Cuestiones relacionadas