我很难构造查询,要避免使用笛卡尔积,不要执行太多查询并获得想要的结果。
我有表Todo
,每个Todo
都有一个所有者,类型为User
。
此外,如果键入Todo
,则每个ResponsibleUsers
都有一个IList<User>
的列表。
我想获得一个列表,其中Todo
是当前User
的所有者或ResponsibleUsers
之一。
这些对象的映射如下:
public class Todo
{
public virtual long Id { get; set; }
public virtual string Name { get; set; }
public virtual User Owner { get; set; }
public virtual IList<TodoUserX> ResponsibleUsers { get; set;}
}
public class TodoUserX
{
public virtual Todo Todo { get; set; }
public virtual User User { get; set; }
}
public class User
{
public virtual long Id { get; set; }
public virtual string Fullname { get; set; }
}
我可以使用group by
避免使用笛卡尔积,但是我只想获得Todo
,但也不想获得ResponsibleUsers
。
我尝试了以下方法:
public IList<Todo> GetTodos(long userId)
{
QueueTodoResponsibleUsersFuture();
var query = Session.QueryOver(() => _todoAlias)
//How to add the conditions for Owner and responsible users?
return query.List();
}
private void QueueTodoResponsibleUsersFuture()
{
Session.QueryOver(() => _todoUserAlias)
.JoinAlias(() => _todoUserAlias.Todo, () =>
_todoAlias, JoinType.LeftOuterJoin)
.JoinAlias(() => _todoUserAlias.User, () =>
_responsibleUserAlias, JoinType.LeftOuterJoin)
.Future<Todo>();
}