LINQ to SQL: сбой при выполнении запроса «двойной IN» - PullRequest
2 голосов
/ 01 апреля 2010

Мне нужно сделать следующее:

var a = from c in DB.Customers 
        where (from t1 in DB.Table1 where t1.Date >= DataTime.Now 
               select t1.ID).Contains(c.ID) && 
              (from t2 in DB.Table2 where t2.Date >= DataTime.Now 
               select t2.ID).Contains(c.ID) 
        select c

Он не хочет бежать. Я получаю следующую ошибку:

Истекло время ожидания. Период ожидания истекший до завершения операция или сервер не отвечает.

Но когда я пытаюсь запустить:

var a = from c in DB.Customers 
        where (from t1 in DB.Table1 where t1.Date >= DataTime.Now 
               select t1.ID).Contains(c.ID)
        select c

Или:

var a = from c in DB.Customers 
        where (from t2 in DB.Table2 where t2.Date >= DataTime.Now 
               select t2.ID).Contains(c.ID) 
        select c

Это работает! Я уверен, что оба запроса IN содержат идентификаторы клиентов.

Ответы [ 3 ]

3 голосов
/ 01 апреля 2010

В случае, если это проблема эффективности, было бы неплохо взглянуть на SQL-запрос, который генерирует LINQ to SQL (в режиме отладки наведите курсор мыши на a). В любом случае вы можете попробовать переписать запрос, используя join. Нечто подобное должно сработать:

var a = from c in DB.Customers  
        join t1 in DB.Table1 on c.ID equals t1.ID
        join t2 in DB.Table2 on c.ID equals t2.ID
        where t1.Date >= DateTimeNow && t2.Date >= DateTimeNow 
        select c
1 голос
/ 01 апреля 2010

Это не обязательно приводит к сбою, но, скорее всего, приводит к неэффективному запросу, время которого истекло. Хорошая вещь, которую нужно сделать, - запустить SQL Server Profiler, чтобы увидеть фактический запрос, отправляемый в SQL, а затем выполнить некоторый анализ этого.

0 голосов
/ 02 апреля 2010

Я нашел проблему. Это в моем порядке NEWID () по методу, потому что я хочу получить случайные результаты. Когда я его удаляю, все работает нормально. Как я могу использовать NEWID ()?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...