Тайм-аут при левом соединении с использованием LINQ to Entities - PullRequest
0 голосов
/ 03 марта 2011

У меня есть следующий запрос LINQ, который выполняет левое соединение:

var results = from v in ctx.dat_Visitor
              join sp in ctx.vwSP on v.lu_Mentor.ID equals sp.ID into sp2
              select new {
                 Visitor = v.Name,
                 Tot = sp2.Count(),
                 SP2 = sp2
              };

Моя проблема в том, что этот запрос LINQ остановился на мне.Я даже увеличил время ожидания по умолчанию с 15 до 120 секунд, и оно все еще истекло.

dat_Visitor содержит не более 10 записей, но vwSP (это представление) имеет где-то около 100 000 записей.

Я точно знаю, что тайм-аут связан с тем, когда я пытаюсь на самом деле вернуть sp2 в результатах.Если я изменю свой запрос LINQ, чтобы не возвращать sp2 в результатах, то это быстро.Без sp2 запрос выглядит так:

var results = from v in ctx.dat_Visitor
              join sp in ctx.vwSP on v.lu_Mentor.ID equals sp.ID into sp2
              select new {
                 Visitor = v.Name,
                 Tot = sp2.Count()
              };

Наконец, Я использую 3,5-фреймворк , но у меня есть серьезные мысли по поводу обновления сайта до 4.0, так как я мог тогдаиспользовать DefaultIfEmpty ().

1 Ответ

1 голос
/ 03 марта 2011

Я не уверен, что вы пытаетесь сделать здесь, но ваш первый запрос фактически возвращает все 100К строк для каждого v.Когда у вас есть сервер, выполняющий над ними какие-то операции, это нормально.Но как только вы действительно пытаетесь переместить их по всей сети, это действительно заставляет вас платить.

Видите ли, sp2 - это не строка из vwSP, а скорее последовательность строк из vwSP, которые соответствуют текущим v.

Если вы хотите получить один sp для каждого v, верните sp2.FirstOrDefault() вместо просто sp2.

Если вы хотите получить все sp с соответствующими им v с, вы можете изменить свой запрос следующим образом:

var results = from v in ctx.dat_Visitor
          join sp in ctx.vwSP on v.lu_Mentor.ID equals sp.ID into sps
          from sp in sps
          select new {
             Visitor = v.Name,
             Tot = sps.Count(),
             SP2 = sp
          };

Если вам нужно что-то еще, уточните, что это было.

...