2011-10-07 64 views
1

我正在執行一個QueryOver查詢,並有一個限制線索有效地做了一個WHERE IN cluase。Nhibernate和一個限制在哪裏的ids的大名單

如果我將有成千上萬的結果從內部查詢返回,這顯然是一個緩慢的查詢吧?

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

是否有可能將其轉換成一個INNER JOIN不知何故?

+0

是來自一個與'SomeEntity',外鍵和/或導航屬性的關係對象'listOfIds'?而且,如果是這樣,你可以通過其他任何方式選擇這些相關對象,然後是「IsIn」嗎? –

回答

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>(); 
2

你可以將其轉換爲一個子查詢或內部連接。您的限制是您可以添加到sql server中的查詢的參數數量,該參數大約爲2.2 k個參數。你當前的代碼工作方式,你應該從大約2k分塊參數,並將它們添加到結果列表。