我目前正在开发一个解决方案,其中包含用户,工作队列和工作项的概念。在基本级别,用户分配了一系列工作队列,工作队列包含要完成的工作。
所以 - 目前我们有一个返回所有队列的基本Linq查询,但我希望限制该查询以提高性能 - 基于当前查询,它可以回收超过94,000条记录,最多127个工作队列。原因是在这个linq查询中我们包含WorkItems,以便我们可以(稍后)计算队列中的工作项数。我已经扩展了WorkQueue对象以包含一个LinqQuery来计算记录的数量 - 我希望它可以工作,但除非初始查询包含工作项,否则无法工作。
这基本上是使用主/详细类型接口进行数据绑定,我有点担心(基于LINQ生成的跟踪字符串)产生的大量数据会影响性能。
从历史上看,我会使用直接的SQL绑定 - 但之前的开发人员已经决定使用EF。我还因为我们仍在使用Entity Framework Modeling系统的第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 :(得分:0)
您可以通过使用.Select()来仅检索您关心的列并使用.Skip()分页来开始优化它。Take()
此外,为什么不使用select语句,而不是抓住所有WorkItems,而不是:
.Select(i => new { Count = i.WorkItems.Count() })
并删除.Include(“WorkItems”),如果你需要的只是WorkItems的数量。
抱歉,我正在使用C#,我从不用VB编写,但相信你明白我想说的是什么