2016-10-28 5 views
0

アイテムIDのリストを持っていますplayerIds(彼らはRedisから来ています)、私はNHibernateを通してそれらのオブジェクト(User)を取得したいと思いますが、それは最適だと思う。NHibernateでidsを持つアイテムのリストを取得する方法

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のサポート '.Contains()'メソッドをサポートしていますか? EF6では 'var topPlayers = usersDbSet.Where(u => playerIds.Contains(u.Id))。ToArray();'を実行できます。あなたのアプローチでは、1の代わりにN SQLクエリを行うことに注意してください。 –

+0

それは動作しますが、それは最適化されていますか?私は 'Users'の大きなテーブルを知りません。答えを見つけるためにすべてを繰り返してください。 – AminSojoudi

+2

Afaik、 'Contains'は、" SELECT * FROM Users {1、3、5、7、9 ...} "のようなクエリを生成します。あなたのアプローチよりはるかに最適化されています:) SQLをプロファイリングし、生成されたクエリをチェックすることができます。 –

答えて

1

ザ・NHibernateのは、LINQプロバイダは.Contains

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); 
} 
関連する問題