2013-07-25 155 views
0

我想加入兩個nhibernate查詢的結果。我在這裏面臨的問題是,它首先獲取這兩個查詢的所有行,然後執行where,這極大地降低了查詢速度。這是因爲我正在做一個List()。但如果沒有它,就不能進行連接。LINQ加入nhibertnate查詢

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) 

如何構建語句,以便查詢在連接之前不會獲得所有的用戶和用戶權限?

回答

3

如果你想使用linqnhibernate你必須使用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要在內存中的對象。像這樣使用,你會在你需要的地方打一個查詢數據庫。