Linq to Entity Framework (v1) - PullRequest
       2

Linq to Entity Framework (v1)

1 голос
/ 01 октября 2010

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

Итак - на данный момент у нас есть базовый запрос 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 работать.

1 Ответ

0 голосов
/ 02 октября 2010

Вы можете начать оптимизировать это с помощью .Select (), чтобы получать только те столбцы, которые вам нужны, и, возможно, использовать подкачку с помощью .Skip (). Take ()

Кроме того, вместо того, чтобы захватывать всеWorkItems, почему бы вам не использовать оператор выбора, такой как:

.Select(i => new { Count = i.WorkItems.Count() })

и избавиться от .Include ("WorkItems"), если все, что вам нужно, это количество WorkItems.

Извините, я использую C #, я никогда не пишу на VB, но, надеюсь, вы понимаете, что я пытаюсь сказать

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