В настоящее время я работаю над решением, в котором есть понятия о пользователях, рабочих очередях и рабочих элементах. На базовом уровне пользователю назначается ряд рабочих очередей, рабочая очередь, содержащая работу, которая должна быть выполнена.
Итак - на данный момент у нас есть базовый запрос Linq, который возвращает все очереди, но я надеялся ограничить этот запрос для повышения производительности - основываясь на текущем запросе, он откатывает более 94 000 записей для максимальной работы 127 очереди. Причина этого заключается в том, что в этот запрос linq мы включаем WorkItems, чтобы мы могли (позже) подсчитать количество рабочих элементов в очереди. Я расширил объект WorkQueue, включив в него LinqQuery для подсчета количества записей, что, как я надеялся, сработает, но это не сработает, если исходный запрос не включает рабочие элементы.
В основном это связано с использованием интерфейса типа мастер / подробности, и меня несколько беспокоит то, что (на основе строки трассировки, сгенерированной из LINQ) существует огромное количество данных, которые влияют на производительность.
Исторически я бы использовал прямую привязку SQL - но предыдущий разработчик решил использовать EF для этого ... Мне также мешает тот факт, что мы все еще используем версию 1 системы моделирования Entity Framework.
Я подумал о замене запроса вызовом хранимой процедуры - но, похоже, это тоже не очень хорошо работает - давая мне дополнительную запись NULL. Я пытался использовать LinqPad - и это работает, но как только вы захотите включить что-то, синтаксис переходит в банк.
Вот что у меня есть ...
Вот запрос Linq:
QueueTable.DataSource = From queue In objImageViewerContext.WorkQueues().Include("WorkItems") _
.Where(Function(i) i.Scan_Type = Constants.Work_Queue_Type_Front_End) _
Order By (queue.WorkItems.Count > 0) Descending, queue.Name Ascending
Вот сгенерированный SQL ...
SELECT WorkQueue_ID, Name, Work_Type, Functional_Area, Process, Text_Code, Barcode, Scan_Type, SLA_Minutes, Medical_Indicator, IsTeamQueue,
C2 AS C1, Role_ID, C4 AS C2, C3, WorkItem_ID, Participant, Last_Action, Last_Modified, Date_Added, Modified_By, Is_Urgent_Action, Image_ID,
Queue_ID
FROM (SELECT CASE WHEN ([Project2].[C1] > 0) THEN CAST(1 AS bit) WHEN (NOT ([Project2].[C2] > 0)) THEN CAST(0 AS bit) END AS C1,
Project2.WorkQueue_ID, Project2.Name, Project2.Work_Type, Project2.Functional_Area, Project2.Process, Project2.Text_Code,
Project2.Barcode, Project2.Scan_Type, Project2.SLA_Minutes, Project2.Medical_Indicator, Project2.IsTeamQueue, Project2.Role_ID,
1 AS C2, Extent4.WorkItem_ID, Extent4.Image_ID, Extent4.Queue_ID, Extent4.Participant, Extent4.Last_Action, Extent4.Last_Modified,
Extent4.Date_Added, Extent4.Modified_By, Extent4.Is_Urgent_Action, CASE WHEN ([Extent4].[WorkItem_ID] IS NULL) THEN CAST(NULL
AS int) ELSE 1 END AS C3, CASE WHEN ([Extent4].[WorkItem_ID] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS C4
FROM (SELECT WorkQueue_ID, Name, Work_Type, Functional_Area, Process, Text_Code, Barcode, Scan_Type, SLA_Minutes,
Medical_Indicator, IsTeamQueue, Role_ID, C1,
(SELECT COUNT(CAST(1 AS bit)) AS A1
FROM WorkItems AS Extent3
WHERE (Project1.WorkQueue_ID = Queue_ID)) AS C2
FROM (SELECT WorkQueue_ID, Name, Work_Type, Functional_Area, Process, Text_Code, Barcode, Scan_Type, SLA_Minutes,
Medical_Indicator, IsTeamQueue, Role_ID,
(SELECT COUNT(CAST(1 AS bit)) AS A1
FROM WorkItems AS Extent2
WHERE (Extent1.WorkQueue_ID = Queue_ID)) AS C1
FROM WorkQueues AS Extent1
WHERE (N'Front End' = Scan_Type)) AS Project1) AS Project2 LEFT OUTER JOIN
WorkItems AS Extent4 ON Project2.WorkQueue_ID = Extent4.Queue_ID) AS Project3
Это так расстраивает, потому что я знаю, что могу написать SQL, чтобы выполнить то, что хочу, я просто не могу заставить Linq работать.