我已经简化了这一点,因为我在寻找一个通用的答案。比方说,我有一个表的设置是这样的: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