我正在尝试加入两个nhibernate查询的结果。我在这里面临的问题是,它首先获取两个查询的所有行,然后执行where,这会极大地降低它的速度。发生这种情况是因为我正在做一个List()。但没有它,就无法加入。
var results= from u in session.QueryOver<User>().List()
join ur in session.QueryOver<UserRights>().List()
on u.Id equals ur.User.Id
where u.Deleted == false && (ur.Role.Id == 10 || ur.Role.Id == 20)
如何构建语句,以便查询在加入之前不会获得所有用户和用户权限?
答案 0 :(得分:3)
如果您想linq
使用nhibernate
,则必须使用session.Query<T>
代替session.QueryOver<T>
。试试这个:
// prepare the query
var query = from u in session.Query<User>()
join ur in session.Query<UserRights>() on u.Id equals ur.User.Id
where u.Deleted == false && (ur.Role.Id == 10 || ur.Role.Id == 20)
select u;
// execute query and get list
var results = query.ToList();
此外,避免使用.ToList()
创建查询,因为它将加载内存中的所有实体(执行完整查询)并在内存中执行Linq To Object。使用这样的方法,您将点击您需要的查询数据库。