У меня есть следующее заявление Linq, который работает довольно медленно (я вижу 3 второй раз)Linq оператор работает очень медленно
var results =
from pi in ProductItems.Include("Parent")
join nt in PicklistDetails
on pi.Diameter.PicklistCode + "-" + pi.Schedule.PicklistCode
equals nt.PicklistCode
where pi.Active
select new
{
Active = pi.Active,
ID = pi.ID,
IsCategory = pi.IsCategory,
Name = pi.Name,
Diameter = pi.Diameter.Value1,
Thickness = nt.Value1,
ThicknessCode = pi.Diameter.PicklistCode + "-" + pi.Schedule.PicklistCode
};
results.Dump();
Я могу написать эквивалентное заявление непосредственно в SQL и он работает гораздо быстрее. Может ли кто-нибудь сказать мне, есть ли более эффективный способ написать запрос linq?
ОБНОВЛЕНИЕ: Спасибо за все ответы, приведенные ниже, представляют собой дополнительную информацию. Сгенерированный SQL из запроса выше LinQ выходит так:
SELECT
[Extent1].[ID] AS [ID],
[Extent1].[Active] AS [Active],
[Extent1].[IsCategory] AS [IsCategory],
[Extent1].[Name] AS [Name],
[Extent7].[Value1] AS [Value1],
[Extent2].[Value1] AS [Value11],
[Extent7].[PicklistCode] + N'-' + [Extent8].[PicklistCode] AS [C1]
FROM [dbo].[ProductItem] AS [Extent1]
INNER JOIN [dbo].[PicklistDetails] AS [Extent2] ON EXISTS (SELECT
1 AS [C1]
FROM (SELECT 1 AS X) AS [SingleRowTable1]
LEFT OUTER JOIN (SELECT
[Extent3].[ID] AS [ID],
[Extent3].[PicklistCode] AS [PicklistCode]
FROM [dbo].[PicklistDetails] AS [Extent3]
WHERE [Extent1].[DiameterID] = [Extent3].[ID]) AS [Project1] ON 1 = 1
LEFT OUTER JOIN (SELECT
[Extent4].[ID] AS [ID],
[Extent4].[PicklistCode] AS [PicklistCode]
FROM [dbo].[PicklistDetails] AS [Extent4]
WHERE [Extent1].[ScheduleID] = [Extent4].[ID]) AS [Project2] ON 1 = 1
LEFT OUTER JOIN (SELECT
[Extent5].[ID] AS [ID],
[Extent5].[PicklistCode] AS [PicklistCode]
FROM [dbo].[PicklistDetails] AS [Extent5]
WHERE [Extent1].[DiameterID] = [Extent5].[ID]) AS [Project3] ON 1 = 1
LEFT OUTER JOIN (SELECT
[Extent6].[ID] AS [ID],
[Extent6].[PicklistCode] AS [PicklistCode]
FROM [dbo].[PicklistDetails] AS [Extent6]
WHERE [Extent1].[ScheduleID] = [Extent6].[ID]) AS [Project4] ON 1 = 1
WHERE (([Project1].[PicklistCode] + N'-' + [Project2].[PicklistCode]) = [Extent2].[PicklistCode]) OR (([Project3].[PicklistCode] + N'-' + [Project4].[PicklistCode] IS NULL) AND ([Extent2].[PicklistCode] IS NULL))
)
LEFT OUTER JOIN [dbo].[PicklistDetails] AS [Extent7] ON [Extent1].[DiameterID] = [Extent7].[ID]
LEFT OUTER JOIN [dbo].[PicklistDetails] AS [Extent8] ON [Extent1].[ScheduleID] = [Extent8].[ID]
WHERE [Extent1].[Active] = 1
я могу получить тот же результат в SQL гораздо быстрее, используя этот запрос:
select pi.Active, pi.id, pi.IsCategory, pi.Name, diameter.Value1 as diameter, nt.Value1 as thickness, diameter.PicklistCode + '-' + schedule.PicklistCode as thicknesscode
from ProductItem pi
inner join PicklistDetails diameter on diameter.id = pi.DiameterID
inner join PicklistDetails schedule on schedule.id = pi.ScheduleID
inner join PicklistDetails nt on nt.PicklistCode = diameter.PicklistCode + '-' + schedule.PicklistCode
where pi.Active = 1
Я знаю, что я могу запустить этот SQL запрос напрямую, но я хотел бы посмотреть, могу ли я получить запрос linq быстрее. Как я уже упоминал, запрос linq выполняется в течение примерно 3 секунд, а запрос sql выполняется с шагом 1 сек.
Я проверил план выполнения и две основные элементы следующим образом 41% Sort ([ProductItem] .DiameterID по возрастанию, [ProductItem] .ScheduleID по возрастанию, [PicklistDetails] .PicklistCode по возрастанию) 49% количество строк золотника (Lazy Spool) Я не совсем уверен, что это такое.
Вы проверили, как выглядит сгенерированный SQL? – MarcinJuraszek
Вы посмотрели на SQL, который генерирует оператор linq? Это, как правило, дает вам подсказку. 'myContext.GetGeneratedSQL (результаты);' – McAden
Я предполагаю, что для этого существует сервер sql. Если это так, это соединение выглядит медленным. Иногда присоединение к тексту может быть медленным. – clhereistian