Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 优化实体框架数据需要一对多_Sql_Entity Framework_Optimization_Entity Relationship - Fatal编程技术网

Sql 优化实体框架数据需要一对多

Sql 优化实体框架数据需要一对多,sql,entity-framework,optimization,entity-relationship,Sql,Entity Framework,Optimization,Entity Relationship,我们的应用程序中有一个数据拉入,导致性能噩梦。目前的情况是基于区域的查询,其中我们有大量的客户列表,他们在查看客户时应该只看到所在区域的客户。当前表格(为便于解释而减少): 然后使用以下语句通过.net实体框架检索(edmx设置一对多关系,其中一个客户可以有多个RegionCustomer): 当您处理两个表中Region真的是多对多吗?在大多数情况下(同样,我不知道您的),客户到地区将是一对多,RegionID可以直接带到客户表中。有了这一点,我知道一些情况下,客户可能位于多个地区。 Enti

我们的应用程序中有一个数据拉入,导致性能噩梦。目前的情况是基于区域的查询,其中我们有大量的客户列表,他们在查看客户时应该只看到所在区域的客户。当前表格(为便于解释而减少):

然后使用以下语句通过.net实体框架检索(edmx设置一对多关系,其中一个客户可以有多个RegionCustomer):

当您处理两个表中<1000条记录时,这运行正常,但在这之后,这是一场性能噩梦,sql server会使CPU加速—这是一件令人震惊的事情,需要很长时间。上面语句创建的SQL对于它需要做的事情来说是非常糟糕的(通过SQL分析器进行跟踪)

只是想知道是否有人对如何加快这一进程有任何想法


提前感谢

从地区客户开始应该会有所帮助:

EntitiesManager.RegionCustomers.Where(function(regionCustomer) regionCustomer.RegionID = CurrentUserRegionID).SelectMany(function(regionCustomer) regionCustomer.Customers).ToList()
我不习惯VisualBasic语法,但如果这是错误的,在C#中,它将是:

EntitiesManager.RegionCustomers.Where(regionCustomer => regionCustomer.RegionID == CurrentUserRegionID).SelectMany(regionCustomer => regionCustomer.Customers).ToList();
我认为SQL将是以下几点:

SELECT * FROM Customer WHERE CustomerID IN (SELECT CustomerID FROM RegionCustomer WHERE RegionID = {0})

您还可以考虑用SKIP()()()来优化分页(Office Cub)表,如果客户机不存在,则与客户机上的客户机进行外键关系优化。这应该是一个非常快速的查询

另外,请务必检查,以查看SQL Server是否有任何建议


祝你好运

嗨,丹,谢谢你的回复。SelectMany在这段关系中不适合我。它只允许我直接进行选择,返回正确的数据(EntitiesManager.RegionCustomers.Where(function(regionCustomer)regionCustomer.RegionID=CurrentUserRegionID)。选择(function(regionCustomer)regionCustomer.Customers.ToList())但这实际上比原来的方法慢?有趣的是,很多方法都不起作用。让我想知道这是不是一个VB的东西或什么…我会更新我的答案,如果这是你的问题,但有没有一个原因,为什么你不只是映射为一个多对多的关系,因为它是?似乎您真正想要做的是EntitiesManager.Customers.Where(函数(客户)customer.Regions.Any(函数(区域)region.RegionID=CurrentUserRegionID)。ToList()@瑞文:如果以上是您想要的,请检查此项:您将要删除RegionCustomerID。这是假设您正在使用设计器,而不是在其他任何地方使用RegionCustomerID。如果您先执行代码,则可以使用配置来执行此操作,而不删除RegionCustomerID。如果这是您想要的,请检查此答案:@Raven:我确信您的DB设计适合您的情况,但我很好奇;Customer->Region真的是多对多吗?在大多数情况下(同样,我不知道您的),客户到地区将是一对多,RegionID可以直接带到客户表中。有了这一点,我知道一些情况下,客户可能位于多个地区。
EntitiesManager.RegionCustomers.Where(regionCustomer => regionCustomer.RegionID == CurrentUserRegionID).SelectMany(regionCustomer => regionCustomer.Customers).ToList();
SELECT * FROM Customer WHERE CustomerID IN (SELECT CustomerID FROM RegionCustomer WHERE RegionID = {0})