Прошу прощения за мое невежество, я новичок в nHibernate и у меня возникла концептуальная проблема при попытке фильтрации дочерней коллекции с помощью запроса nHibernate
Моя объектная модель содержит две сущности: User и Task, настроенные так
public class User
{
public User()
{
this.Tasks = new List<Task>();
}
public User(int id): this()
{
this.Id = id;
}
public virtual int Id { get; private set; }
public virtual IList<Task> Tasks { get; set; }
}
public class Task
{
public Task() { }
public Task(int id, bool active): this()
{
this.Id = id;
this.Active = active;
}
public virtual int Id { get; set; }
public virtual bool Active { get; set; }
}
Мои сопоставления nHibernate для них следующие:
public class UserMap: ClassMap<User>
{
public UserMap()
{
Table("user");
Id(x => x.Id);
HasMany(x => x.Tasks);
}
}
public class TaskMap : ClassMap<Task>
{
public TaskMap()
{
Table("task");
Id(x => x.Id);
Map(x => x.Active);
}
}
В моей базе данных есть две таблицы 'task' и 'user', которые я таким образом заполнил
SELECT * FROM task;
+----+--------+---------+
| Id | Active | User_id |
+----+--------+---------+
| 1 | 1 | 3 |
| 2 | 1 | 3 |
| 3 | 1 | 3 |
| 4 | 0 | 3 |
| 5 | 0 | 3 |
| 6 | 1 | 1 |
| 7 | 1 | 1 |
| 8 | 1 | 1 |
| 9 | 0 | 1 |
| 10 | 0 | 1 |
+----+--------+---------+
10 rows in set
SELECT * FROM user;
+----+
| Id |
+----+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
+----+
5 rows in set
Я пытаюсь выполнить запрос, который возвращает конкретного пользователя с только активными задачами из его коллекции «Задачи»
var query = QueryOver.Of<User>()
.Where(u => u.Id == 3)
.JoinQueryOver<Task>(x => x.Tasks)
.Where(t => t.Active == true);
var results = dataProvider.ExcecuteQuery<User>(query);
Когда я выполняю этот запрос, я ожидаю получить один пользовательский объект с3 объекта Task в его коллекции Tasks, вместо этого я получаю 3 копии одного и того же объекта задачи (task.Id = 3), каждый из которых имеет все 5 задач в соответствующих коллекциях.
Возможно ли то, что я пытаюсь сделать, на самом деле возможно, или я должен вместо этого просто запрашивать объект Task?
Надеюсь, что это не тот случай, так как было бы неплохо иметь возможность простопросматривать активные задачи пользователей без необходимости возиться с ручной фильтрацией.