Я пытаюсь взять этот sql-запрос и превратить его в Hhibernate-HQL-запрос.Я использую nhibernate 3 и Fluent Nhibernate 1.2
SELECT dbo.Tasks.CourseId, dbo.CoursePermissions.BackgroundColor, dbo.Tasks.DueDate, dbo.Tasks.TaskName, dbo.Tasks.TaskId
FROM dbo.Courses INNER JOIN
dbo.Tasks ON dbo.Courses.CourseId = dbo.Tasks.CourseId INNER JOIN
dbo.CoursePermissions ON dbo.Courses.CourseId = dbo.CoursePermissions.CourseId
WHERE (dbo.Tasks.CourseId = 1)
Мне бы хотелось использовать linq, но я не думаю, что nhibernate поддерживает объединения linq, поэтому я думаю, что я застрял с использованием HQL (если кто-то не знаетлучший путь).
Полагаю, я могу использовать QueryOver или другие способы, которыми nhibernate выполняет запросы, чтобы все работало лучше.Я до сих пор не понимаю разницу между всеми способами, как если бы я мог делать все в linq.
Однако я не знаю, как написать свой запрос.
Спасибо
Редактировать
Теперь у меня есть это (немного изменилось)
Course cAlias = null;Task tAlias = null;CoursePermission cpAlias = null;
var result = session.QueryOver<Task>(() => tAlias)
.JoinAlias(() => tAlias.Course, () => cAlias)
.JoinAlias(() => cAlias.CoursePermissions, () => cpAlias)
.Where(Restrictions.In(Projections.Property(() => cAlias.Id), courseIds))
.And(x => x.DueDate >= startDate)
.And(x => x.DueDate <= endDate)
.Select( Projections.Property(() => cAlias.Id),
Projections.Property(() => cpAlias.BackgroundColor),
Projections.Property(() => tAlias.DueDate),
Projections.Property(() => tAlias.TaskName),
Projections.Property(() => tAlias.TaskId))
.List<object[]>();
Я знаю, хочу отобразить его на
открытый класс TaskAppointments {public int Id {get;задавать;} публичная строка BackgroundColor {get;задавать;} public DateTime DueDate {get;задавать;} public int TaskId {get;задавать;} публичная строка TaskName {get;задавать;}
}
Как мне это сделать.Если бы это был метод linq, я бы сделал
.Select(new TaskAppointments { TaskId = Projections.Property(() => tAlias.TaskId)})
, но он говорит, что не может преобразовать его в целое число.
Edit2
Это то, что я придумал
Course cAlias = null;Task tAlias = null;CoursePermission cpAlias = null;TaskAppointments taskAppointments = null;
List<TaskAppointments> result = session.QueryOver<Task>(() => tAlias)
.JoinAlias(() => tAlias.Course, () => cAlias)
.JoinAlias(() => cAlias.CoursePermissions, () => cpAlias)
.Where(Restrictions.In(Projections.Property(() => cAlias.Id), courseIds))
.And(x => x.DueDate >= startDate)
.And(x => x.DueDate <= endDate)
.SelectList(list =>
list.SelectGroup(x => x.TaskId).WithAlias(() => taskAppointments.TaskId)
.SelectGroup(() => cpAlias.BackgroundColor).WithAlias(() => taskAppointments.BackgroundColor)
.SelectGroup(x => x.DueDate).WithAlias(() => taskAppointments.DueDate)
.SelectGroup(x => x.TaskName).WithAlias(() => taskAppointments.TaskName)
)
.TransformUsing(Transformers.AliasToBean<TaskAppointments>())
.List<TaskAppointments>().ToList();