【发布时间】:2013-01-18 09:32:28
【问题描述】:
我有 LINQ 查询返回以下错误: “传入的表格数据流 (TDS) 远程过程调用 (RPC) 协议流不正确。此 RPC 请求中提供的参数过多。最大值为 2100”。
我所需要的只是计算所有具有 BirthDate 且我的 ID 包含在列表中的客户。 我的客户 ID 列表可能很大(数百万条记录)。
这里是查询:
List<int> allClients = GetClientIDs();
int total = context.Clients.Where(x => allClients.Contains(x.ClientID) && x.BirthDate != null).Count();
当查询以这种方式重写时,
int total = context
.Clients
.Count(x => allClients.Contains(x.ClientID) && x.BirthDate != null);
它会导致同样的错误。
还尝试以不同的方式制作它,它会吃掉所有的记忆:
List<int> allClients = GetClientIDs();
total = (from x in allClients.AsQueryable()
join y in context.Clients
on x equals y.ClientID
where y.BirthDate != null
select x).Count();
【问题讨论】:
-
GetClientIDs从哪里获取数据?如果它从数据库中提取它,您可能希望将其组合到查询中,而不是提取所有 id 以在单独的查询中使用。 -
我认为这种形式是不可能做到的。
allClients.Contains(x.ClientID)强制查询在本地工作。 -
@HamletHakobyan 不,
allClients可以是包含 linq-to-sql 查询的IQueryable。如果是这样,它将作为 SQL 合并到total查询中。 -
@GertArnold 第一次转换
allClients.AsQueryable()不能保证allClients是IQueryable。无论如何,即使allClients是IQueryable也不能保证将整个 LINQ 查询转换为 SQL 查询。 -
@HamletHakobyan 也许吧。但juharr的建议值得一试。康斯坦丁,如果那是不可能的,我认为你唯一的选择就是分块进行查询。
标签: c# asp.net sql linq linq-to-sql