我想使用查询来给我一个对象
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; }
}
尝试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();
结果:188个记录,课程对象全部为null。
尝试2
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();
结果:188个课程的所有属性都有几乎相同的错误
'((new System.Collections.Generic.Mscorlib_CollectionDebugView<Domain.PlannerTask>(result)).Items[0].Course).CoursePermissions' threw an exception of type 'NHibernate.ObjectNotFoundException'
尝试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_
结果:
CoursePermissions = '((Castle.Proxies.CourseProxy)((new System.Collections.Generic.Mscorlib_CollectionDebugView<PlannerTask>(result)).Items[0].Course)).CoursePermissions' threw an exception of type 'NHibernate.ObjectNotFoundException'
尝试4
尝试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_
作品。我可以访问课程对象中的所有内容。
似乎有问题
tAlias.PersonalTaskReminders和tAlias.TaskReminders。如果我删除这些课程将呈现正常。
我不明白为什么。
答案 0 :(得分:25)
我认为问题是您正在尝试投影课程代理对象。预测用于平面数据传输对象。您可以声明此视图所需的课程属性。
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; }
}
选择列表可以简化一点......
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>();