我已經簡化了這一點,因爲我在尋找一個通用的答案。比方說,我有一個表的設置是這樣的:Linq .Contains with large set cause TDS error
Parent
recno int (unique, pk)
date datetime
stuff varchar(50)
Child
parentrecno (int, fk) --- PK
sequence (int) --- PK
data varchar(50)
在我的C#程序,我經歷了很多麻煩的是找父記錄,我很感興趣,並把它們塞進一個列表。父母是一張非常大的桌子,我寧願不要查詢它。所以我喜歡儲存的鑰匙:
List<int> recs = (from d in Parent where [.....] select d.recno).ToList();
Linq中
後來我可以說,找到所有的子記錄相關聯的父母:
var kids = from k in database.Childs
where recs.Contains(k.parentrecno)
select new { k };
這是所有偉大的,直到經濟共同體包含超過2100條目。然後我得到一個TDS RPC錯誤(太多參數)。
我看到它,我能方式:
不要在直線上升SQL整個事情(其實不想做經歷的麻煩與一個DataReader,等...)。有一個涉及記錄資格的外部系統,所以我不知道這是否完全有可能。另外,我會生成這個列表兩次 - 一次當我需要在.Contains()中使用它,並再次用於其他目的。
打破列表(錄製),然後閱讀塊中的孩子。
如果我把它分解成塊,然後我漂亮的LINQ遠一點下來不會在所有的工作:
var kids2 = (from kid in paydb.Childs
where
recs.Contains(kid.parentrecno)
group pay by kid.parentrecno into kgroup
select new { ParentRecNo = kgroup.Key, KidRecords = kgroup })
.ToDictionary(kx => kx.ParentRecNo);
因爲列表區域經濟共同體將包含需要組合在一起的東西,但必須爲Linq查詢拆分。
我的一個大問題是,在REC中限定記錄並非全部都是在SQL中完成的 - 還有另一個系統涉及到。能夠將這些密鑰鏟入臨時表也是可以的,除非我不認爲我可以從Linq獲得臨時表。 – 2009-06-17 16:56:53
我更新了我的答案,並提供了有關如何解決問題的其他信息。 – 2009-06-23 07:05:53