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)

LINQPad

LINQ/LinqPad:相同的查询不同的结果

如何在 LinqPad 中提交更改

有没有人使用 LINQPad 连接到 Tridion 核心服务?

在LINQPad中使用FreeSql查询数据库