2016-10-28 56 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); 
} 
相关问题