【发布时间】:2010-11-03 17:17:42
【问题描述】:
我有点过于简化了,因为我正在寻找一个通用的答案。假设我有一个这样的表设置:
Parent
recno int (unique, pk)
date datetime
stuff varchar(50)
Child
parentrecno (int, fk) --- PK
sequence (int) --- PK
data varchar(50)
在我的 C# 程序中,我经历了很多麻烦来找到我感兴趣的 Parent 记录并将它们填充到一个列表中。 Parent 是一个非常大的表,我宁愿不要对它进行不必要的查询。所以我把钥匙藏起来了:
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 };
这一切都很好,直到 recs 包含超过 2100 个条目。然后我得到一个 TDS RPC 错误(参数太多)。
我认为我可以:
直接用 SQL 完成整个事情(真的不想用 DataReader 等麻烦来做)。有一个外部系统参与了对记录的限定,所以我也不知道这是否完全可能。另外,我会生成该列表两次——一次是在我需要在 .Contains() 中使用它时,另一次用于其他目的。
分解列表(recs),然后分块读取 Child。
如果我把它分成几块,那么我漂亮的 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);
因为 List recs 将包含需要组合在一起的内容,但必须为 Linq 查询分开。
【问题讨论】: