Вложенный запрос в предложении from - PullRequest
0 голосов
/ 10 августа 2010

Я написал этот код LINQ:

from workTask in VwWorkTask.Where(e => e.TaskStateStr != "A" 
                                    && e.TaskStateStr != "B")
join workContext in TblWorkTOBProlongationWorkContexts 
        on workTask.WorkContextId equals workContext.Id  
join client in VwClient 
        on workContext.Client equals client.ClientId  into t1
from client in t1.DefaultIfEmpty()
....// other joins
select workTask

, который генерирует этот запрос T-SQL:

SELECT [t0].*
FROM [vwWorkTask] AS [t0]
INNER JOIN [tblWorkTOBProlongationWorkContext] AS [t1] 
        ON [t0].[WorkContextId] = ([t1].[Id])
LEFT OUTER JOIN [vwClient] AS [t2] ON [t1].[Client] = [t2].[ClientId]
... -- other joins
WHERE ([t0].[TaskStateStr] <> @p0) AND ([t0].[TaskStateStr] <> @p1)

Но мне нужно что-то вроде этого:

SELECT [t0].*
FROM [select * vwWorkTask WHERE ([t0].[TaskStateStr] <> @p0) 
                          AND ([t0].[TaskStateStr] <> @p1)] AS [t0]
INNER JOIN [tblWorkTOBProlongationWorkContext] AS [t1] 
        ON [t0].[WorkContextId] = ([t1].[Id])
LEFT OUTER JOIN [vwClient] AS [t2] ON [t1].[Client] = [t2].[ClientId]
... -- other joins

Другими словами, мне нужен вложенный запрос с проверкой "где" до всех соединений, а не после.Любые идеи, как я могу переписать запрос LINQ для достижения этой цели?

Спасибо.

Ответы [ 5 ]

0 голосов
/ 11 августа 2010

Если вы не удовлетворены генерируемым TSQL, рассмотрите вариант записи точного запроса в хранимую процедуру. Создайте новую хранимую процедуру, возможно, с именем GetWorkTaskClientSomething. Вставьте этот вызов TSQL с необходимыми параметрами.

Затем вы можете отобразить наборы возвращаемых результатов в пользовательский класс по вашему выбору. Вы можете написать это с нуля или повторно использовать существующий класс.

Это позволит вам управлять TSQL по своему усмотрению и позволит вам продолжать использовать классы моделей, которые вам предоставляют поставщики LINQ To SQL.

List<foo> = db.GetWorkTaskClientSomething('foo', 'bar', 1);
0 голосов
/ 10 августа 2010

Покажите нам актуальные запросы

Оригинальный пост содержит оба запроса.Что еще нужно?Они почти идентичны, за исключением одной маленькой детализации - сгенерированный запрос применяет условия «где» после всех соединений.Я считаю, что оптимизатор MSSQL не может просто перестать использовать эти представления, иначе человек, ответственный за их создание, просто убьет меня.

0 голосов
/ 10 августа 2010

ок, может есть другие варианты?Может быть, я должен попытаться убедить моих коллег и премьер-министра в том, что LINQ2SQL и, может быть, ORM вообще не подходят для нашего проекта, и мы должны переписать запросы, используя только sql, пока не стало слишком поздно?

0 голосов
/ 10 августа 2010

Сгенерированный запрос t-sql выполняется около 18 секунд, что совершенно неуместно.Второй, написанный руками, выполняется в течение 2 секунд при макс.

Покажите нам реальные запросы, и мы покажем вам, где происходит фильтрация во втором, который позволяет использовать индексацию.

До этого вы просто троллируете.

0 голосов
/ 10 августа 2010

Вы уверены, что вам это нужно?

Два запроса должны быть практически одинаковыми.

Я думаю, вы обеспокоены тем, что сервер данных выполняет больше работы, чем необходимо, но вы должны верить, что он знает, что делает.

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