Nhibernate和WHERE-in限制中的大量ID列表

Nhibernate和WHERE-in限制中的大量ID列表,nhibernate,Nhibernate,我正在执行一个QueryOver查询,并且有一个有效执行WHERE IN cluase的限制cluase 如果我将有数千个结果从内部查询返回,这显然是一个缓慢的查询,对吗 public List<SomeEntity> GetByIds(List<Guid> listOfIds) { return NHibernateHelper.Session.QueryOver<SomeEntity>() .WhereRestrictionOn(x => x

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

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

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

是否有可能以某种方式将其转换为内部联接?

如果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>();

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

是否通过外键和/或导航属性从与某个实体有关系的对象中获取ListoFID?如果是这样的话,你能通过IsIn选择这些相关的对象吗?