Nhibernate和WHERE限制中的大量id列表

时间:2011-10-07 17:11:04

标签: nhibernate

我正在执行一个QueryOver查询,并且有一个有效地执行WHERE IN cluase的限制cluase。

如果我将从该内部查询返回数千个结果,这显然是一个缓慢的查询对吧?

public List<SomeEntity> GetByIds(List<Guid> listOfIds)
{
  return NHibernateHelper.Session.QueryOver<SomeEntity>()
  .WhereRestrictionOn(x => x.id).IsIn(listOfIds)
  .List();
}

是否有可能以某种方式将其转换为INNER JOIN?

2 个答案:

答案 0 :(得分:2)

您可以将其转换为子查询或内部联接。您的限制是可以添加到sql server中的查询的参数数量,大约是2.2 k参数。您当前代码的工作方式应该是从大约2k的块中拆分参数并将它们添加到结果列表中。

答案 1 :(得分:1)

如果listOfIds来自同一个数据库,那么只有在存在实现时,否则你必须使用sql。

如果listOfIds很大并且不是来自同一个源,那么这可能会更快

Session.CreateSqlQuery("CREATE TEMP TABLE temp (Id)").ExecuteUpdate();
foreach (var id in listofids)
{
    Session.CreateSqlQuery("INSERT INTO temp (?)").SetParam(id).ExecuteUpdate();
}
Session.CreateSqlQuery("CREATE INDEX for temp (Id)").ExecuteUpdate();

return NHibernateHelper.Session.QueryOver<SomeEntity>()
    .UnderlyingCriteria.Add(Expression.Sql("0 < (SELECT Count(*) FROM temp t WHERE t.id = Id)"))
    .List<SomeEntity>();