2

所以我正在接受 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 更适合报告的情况,还是我(可能)做错了?

任何指针?

4

2 回答 2

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))
于 2012-05-29T08:25:39.370 回答
0

删除对 的调用.ToArray()。这样做可以防止一半的查询在服务器上执行。

于 2012-05-28T11:44:35.340 回答