2016-10-28 55 views
0

我有一個項目ID的列表playerIds(他們來自Redis),我想通過NHibernate獲得它們的對象(User),但我寫它的方式不是優化它的想法。如何在NHibernate中獲得帶ID的項目列表

這裏是我的代碼:

List<int> playerIds = redisRespnse.Select(x => int.Parse(x)).ToList(); 
using (var session = sessionFactory.OpenSession()) 
{ 
    List<User> TopPlayers = new List<User>(); 
    for (int i = 0; i < playerIds.Count; i++) 
    { 
     var player = session.Query<User>() 
      .Where(user => user.Id == playerIds[i]) 
      .FirstOrDefault(); 
     if (player != null) 
     { 
      TopPlayers.Add(player); 
     } 
    } 
    var finalResponse = new GetLeaderBoardResponse(TopPlayers); 
    return Ok(finalResponse); 
} 

感謝。

+1

不NHibernate的支持'。載有()'方法?在EF6中,你可以做'var topPlayers = usersDbSet.Where(u => playerIds.Contains(u.Id))。ToArray();'。請注意,使用你的方法,你需要執行N個SQL查詢,而不是1. –

+0

它可以工作,但它是否被優化?,我不知道一個大的用戶表。它應該遍歷所有這些來找到答案。 – AminSojoudi

+2

Afaik,'Contains'生成一個像這樣的查詢:「SELECT * FROM Users WHERE Id in {1,3,5,7,9 ...}」。它比你的方法更優化:)你可以剖析SQL並檢查生成的查詢。 –

回答

1

NHibernate的LINQ提供程序支持。載

List<int> playerIds = redisRespnse.Select(x => int.Parse(x)).ToList(); 
using (var session = sessionFactory.OpenSession()) 
{ 
     var players = session.Query<User>() 
      .Where(user => playerIds.Contains(user.Id)) 
      .Select(user => user).ToList(); 

    } 
    var finalResponse = new GetLeaderBoardResponse(players); 
    return Ok(finalResponse); 
} 
相關問題