2012-05-28 2 views
2

Итак, я беру вызов linqpad: http://www.linqpad.net/Challenge.aspx, и у меня есть отчет для создания всех потенциальных клиентов из одной таблицы не в другой стол, мой LINQ является:linqpad - большое предложение NOT IN выходит за лимит - любым другим способом? - Linq to SQL

//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 вывода с помощью «где не в (ид ...)», как ожидается,

НО ошибка является жесткое ограничение для RPC вызовов:

входящий поток табличного потока данных (TDS) для удаленного вызова процедур (RPC) равен

Неверный формат. Слишком много параметров было предоставлено в этом запросе RPC. Максимальный размер составляет 2100.

Является ли это примером того, что SQL лучше для отчетов, или я (возможно) ошибаюсь?

Любые указатели?

+0

Почему вы не использовать левое соединение от клиентов до продаж? – adrianm

ответ

0

Удалить звонок .ToArray(). Делая это, вы предотвращаете выполнение половины запроса на сервере.

+0

так просто - спасибо – nathfy

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))