C# 有什么方法可以更好地构造这个LINQ查询吗?

C# 有什么方法可以更好地构造这个LINQ查询吗?,c#,sql-server,linq,entity-framework-6,C#,Sql Server,Linq,Entity Framework 6,我正在开发一个新的WPF应用程序。它需要在启动时在datagrid中显示查询结果。在测试中,我发现在某些情况下,运行查询所需的时间可能为2分钟,这是不可接受的。然而,在其他情况下,它可以快得多。差异部分取决于应用程序运行的位置,我怀疑其他因素也会影响它的运行速度。如果离服务器更近(在prem上),则只需几秒钟,尽管在距离服务器更远的其他办公室,它的运行速度会更快。我们大多数人仍然在家工作。在我的家里,我有难以置信的好网速(对于我所在的州来说),但我在这个查询上的表现仍然糟糕透顶 但我现在还不知道

我正在开发一个新的WPF应用程序。它需要在启动时在datagrid中显示查询结果。在测试中,我发现在某些情况下,运行查询所需的时间可能为2分钟,这是不可接受的。然而,在其他情况下,它可以快得多。差异部分取决于应用程序运行的位置,我怀疑其他因素也会影响它的运行速度。如果离服务器更近(在prem上),则只需几秒钟,尽管在距离服务器更远的其他办公室,它的运行速度会更快。我们大多数人仍然在家工作。在我的家里,我有难以置信的好网速(对于我所在的州来说),但我在这个查询上的表现仍然糟糕透顶

但我现在还不知道用户的查询速度有多快,因为他们和我一样远离服务器。下面是用于检索数据的LINQ查询。我可以更好地重组LINQ以获得更好的性能吗

使用(var ctx=new appenties())
{
People=ctx.People.AsNoTracking()。其中(p=>p.Inactive==false)
.包括(p=>p.Agency)
.包括(p=>p.PersonnelCertifications.选择(pc=>pc.CertificationType))
.其中(p=>p.PersonnelCertifications.Any(pc=>pc.CertificationType.CertType==“操作员”))
.OrderBy(p=>p.LastName)
.ThenBy(p=>p.FirstName)
.ToList();
}
以下是主要的餐桌人员:

创建表[app].[Person](
[ID][bigint]标识(1,1)不为空,
[AgencyID][bigint]不为空,
[LastName][nvarchar](25)不为空,
[FirstName][nvarchar](20)不为空,
--为简洁起见,删除了其他列
约束[PK_Person]主键群集
(
[ID]ASC
)(PAD_INDEX=OFF,STATISTICS_norecomputer=OFF,IGNORE_DUP_KEY=OFF,ALLOW_ROW_LOCKS=ON,ALLOW_PAGE_LOCKS=ON,FILLFACTOR=100)打开[主]
)在[PRIMARY]文本上图像在[PRIMARY]上
去
和表代理:

CREATE TABLE[app].[Agency](
[ID][bigint]标识(1,1)不为空,
[AgencyCode][nvarchar](5)不为空,
[AgencyName][nvarchar](50)空,
--为简洁起见,删除了其他列
约束[PK_Agency]主键群集
(
[ID]ASC
)在[主]上(PAD\u INDEX=OFF,STATISTICS\u norecocomputer=OFF,IGNORE\u DUP\u KEY=OFF,ALLOW\u ROW\u LOCKS=ON,ALLOW\u PAGE\u LOCKS=ON,FILLFACTOR=100)的情况下,
约束[AK_AgencyCode]唯一非聚集
(
[机构代码]ASC
)(PAD_INDEX=OFF,STATISTICS_norecomputer=OFF,IGNORE_DUP_KEY=OFF,ALLOW_ROW_LOCKS=ON,ALLOW_PAGE_LOCKS=ON,FILLFACTOR=100)打开[主]
)在[PRIMARY]文本上图像在[PRIMARY]上
去
和表人员认证:

创建表[app]。[人员认证](
[ID][bigint]标识(1,1)不为空,
[CertificationTypeID][bigint]不为空,
[PersonID][bigint]不为空,
[AgencyID][bigint]不为空,
--为简洁起见,删除了其他列
约束[PK_人员认证]主键群集
(
[ID]ASC
)(PAD_INDEX=OFF,STATISTICS_norecomputer=OFF,IGNORE_DUP_KEY=OFF,ALLOW_ROW_LOCKS=ON,ALLOW_PAGE_LOCKS=ON,FILLFACTOR=100)打开[主]
)在[小学]
去
最后是表CertificationType:

创建表[app].[CertificationType](
[ID][bigint]标识(1,1)不为空,
[CertType][nvarchar](30)不为空,
--为简洁起见,删除了其他列
约束[PK_CertificationType]主键群集
(
[ID]ASC
)在[主]上(PAD\u INDEX=OFF,STATISTICS\u norecocomputer=OFF,IGNORE\u DUP\u KEY=OFF,ALLOW\u ROW\u LOCKS=ON,ALLOW\u PAGE\u LOCKS=ON,FILLFACTOR=100)的情况下,
约束[CertType]唯一非聚集
(
[CertType]ASC
)(PAD_INDEX=OFF,STATISTICS_norecomputer=OFF,IGNORE_DUP_KEY=OFF,ALLOW_ROW_LOCKS=ON,ALLOW_PAGE_LOCKS=ON,FILLFACTOR=100)打开[主]
)在[小学]
去

如果您确定:a)这是花费时间最多的地方;和b)所花费的时间主要受网络速度和/或延迟的影响;——然后我看不出优化查询会有什么帮助。顺便问一下,最终生成的SQL是什么样子的?您使用的是实体框架吗?或者您的所有对象都已经从其他数据库函数存储在内存中了?如果使用EF,添加外键或索引可能会有所帮助,但当您开始将这么多表链接在一起时,最好在代码中创建一个新实体,在数据库中创建一个视图。检查EF的查询输出,查看它在做什么。ORM中更复杂的连接/查询往往会产生垃圾查询,如果放在视图中,这些查询可以简化。如果看不到生成的输出,我们真的不知道如何做得更好。您可以尝试左连接