linqpad - 大 NOT IN 子句超出限制 - 还有其他方式吗? - Linq to SQL
Posted
技术标签:
【中文标题】linqpad - 大 NOT IN 子句超出限制 - 还有其他方式吗? - Linq to SQL【英文标题】:linqpad - big NOT IN clause is going over the limit - any other way?- Linq to SQL 【发布时间】:2012-05-28 09:31:05 【问题描述】:所以我正在接受 linqpad 挑战:http://www.linqpad.net/Challenge.aspx,我有一个报告要从一个表而不是另一个表中创建所有潜在客户,我的 linq 是:
//get customers from one table
var salesNotCancelled = Sales.Where(a=>a.Canceled == 2).Select(x => x.Customer_ID).ToArray();
//query against the other table removing customers based on id
var query=Customers.Where(
!salesNotCancelled.Contains(a.Customer_ID)
);
query.Dump();
SQL 输出按预期使用了“where not in (ids...)”
但是错误是 RPC 调用的硬性限制:
传入的表格数据流(TDS)远程过程调用(RPC)协议流是
不正确。此 RPC 请求中提供的参数过多。这 最大值为 2100。
这是 SQL 更适合报告的情况,还是我(可能)做错了?
任何指针?
【问题讨论】:
为什么不使用从客户到销售的左连接? 【参考方案1】:如果您的数据库有外键约束,LINQPad 将自动创建关联属性。因此,您可以按以下步骤构建查询:
Customers.Where (c => !c.Sales.Any (s => s.Canceled == 2))
换句话说,“给我没有任何取消销售的客户”。以下是查询语法中的相同内容:
from c in Customers
where !c.Sales.Any (s => s.Canceled == 2)
select c
如果没有外键约束,则需要添加谓词来执行连接:
Customers.Where (c => !Sales.Any (s => s.Customer_ID == c.Customer_ID && s.Canceled == 2))
【讨论】:
【参考方案2】:删除对.ToArray()
的呼叫。这样做可以防止一半的查询在服务器上执行。
【讨论】:
以上是关于linqpad - 大 NOT IN 子句超出限制 - 还有其他方式吗? - Linq to SQL的主要内容,如果未能解决你的问题,请参考以下文章
在Microsoft Dynamic 365/2016环境使用LinqPad查询数据(不使用linqpad Microsoft Dynamic 365 Driver)