2010-10-01 95 views
1

我目前正在研究解決方案,其中有用戶,工作隊列和工作項的概念。在基本級別上,用戶有一系列分配給他們的工作隊列,工作隊列包含要完成的工作。Linq to Entity Framework(v1)

所以 - 目前我們有一個基本的Linq查詢返回所有的隊列,但我希望限制該查詢以提高性能 - 基於當前查詢,它將最多返回94,000條記錄,最多127條工作隊列。原因是在這個linq查詢中我們包含了WorkItems,這樣我們可以(稍後)統計隊列中的工作項的數量。我已經擴展了WorkQueue對象來包含一個LinqQuery來計算記錄的數量 - 我希望能夠工作,但是除非最初的查詢包含工作項目,否則失敗。

這基本上是使用主/細節類型接口的數據綁定,我有點擔心(根據從LINQ生成的跟蹤字符串)有大量數據會產生影響性能的數據。

從歷史上看,我會使用直接的SQL綁定 - 但以前的開發人員已決定使用EF來做這件事..我也因爲我們仍在使用實體框架建模系統的版本1而受到阻礙。

我已經考慮用一個存儲過程調用替換查詢 - 但這似乎並不能很好地工作 - 給我一個額外的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工作。

回答

0

您可以開始使用。選擇(),以僅獲取您所關心的欄目,並可能使用分頁與.Skip(),以優化此乘坐()

此外,而不是搶佔了所有的工作項你爲什麼不使用select語句如:

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

,擺脫.INCLUDE的(「工作項目」),如果你需要的是工作項的計數。

對不起我使用C#,我從來沒有在VB寫的,但相信你明白我想說

+0

這是brilliant.Syntax似乎確定和我很好用C# - 這是我所選擇的語言,但之前的開發人員選擇了VB.NET,所以我暫時堅持這一點。我已經設法通過歸檔所有已完成的工作項目(這就是爲什麼有這麼多記錄)來解決一個快速而骯髒的問題。我想我可以擴展你的語法來有條件地選擇狀態<>完成的計數。這意味着我可以繼續將所有記錄保留在同一個地方,而不是純粹因爲查詢效率低下而移動它們 - 我從不熱衷於按位置提供的狀態。 – 2010-10-04 11:35:47