2011-09-08 68 views
1

我最近開始使用Telerik的網格(用於ASP.NET MVC)。 '基於Linq的表達引擎'爲您做了所有繁重的工作:分頁,排序和過濾。它只需要與這樣的存儲庫方法聯繫起來:Telerik的電網<-> NHibernate的

public IEnumerable GetBlas() { return Session.Query(); }

現在我有以下問題。我想使用ICriteria和Restrictions.In(「x」,list.ToArray()),其中列表是IList類型,並由另一個進程填充。問題是列表可能包含數百個值,並且這可能會引發異常,因爲生成的SQL代碼的「IN PART」(例如IN(1,2,...,10000))可能太長。

有沒有辦法實現這個,而無需切換到純SQL和處理所有的查詢字符串等Telerik的電網發送方式是什麼?希望這是有道理的。

謝謝。

基督教

+0

我不知道我明白什麼是問題;你擔心你的'in'子句會包含太多的值?在這種情況下,你可以將它分成夾頭,即'Restrinctions.In(「X」,sublist1)或Restrictions.In(「X」,sublist2)等 –

+0

這仍將導致SQL代碼(由NHibernate的生成)我相信這太長了!但是我不確定SQL服務器是否不喜歡sql的長度或參數的數量...... – cs0815

+0

不確定關於sql server;這在Oracle上適用於我。我建議你試一試,看看它是如何發展的。 –

回答

2

這個想法是將10000個項目的列表分成(比方說)1000個項目的小列表。
做查詢使用ICriteria,在那裏,你需要爲每一個子集,你有你可以添加儘可能多的Disjunction最簡便的方法。

如果ICriteria是不是一種選擇,可以有一種變通方法,您創建多個Future查詢,像這樣(測試代碼,這不只是1往返的分貝):

string [] names = {"boris", "admin", "scheduleuser"}, moreNames = {"adminuser"}; 
var x = session.Query<User>() 
       .Where(u => names.Contains(u.Name)).ToFuture(); 

var y = session.Query<User>() 
       .Where(u => moreNames.Contains(u.Name)).ToFuture(); 

var res = x.Union(y); 

log.DebugFormat("found {0} users. 1st user is : {1}", res.Count(), res.Count() > 0 ? res.First().FullName : "none"); 
+0

哇,看起來不錯。只是需要考慮的動態情況,我不知道有多少x和YS有... – cs0815

+0

你需要一個'清單'來代替'x'和'y'在本例中,然後遍歷它,'聯合整個事情。沒什麼,真的:) –