我正在执行一个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?
答案 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>();