【问题标题】:Optimizing Entity Framework Data Call for One to Many优化实体框架数据调用一对多
【发布时间】:2013-06-04 14:38:01
【问题描述】:

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

Customer (Table):
CustomerID
FirstName
LastName
....

RegionCustomer (Table):
RegionCustomerID
RegionID
CustomerID

这是通过 .net 实体框架使用以下语句检索的(edmx 设置了一个客户可以拥有多个 RegionCustomer 的一对多关系):

EntitiesManager.Customers.Where(function(x) x.RegionCustomers.Any(function(y) y.RegionID = CurrentUserRegionID)).ToList()

当您在任一表中处理

只是想知道是否有人对如何加快速度有任何想法?

提前致谢

【问题讨论】:

    标签: sql entity-framework optimization entity-relationship


    【解决方案1】:

    从 RegionCustomers 开始应该会有所帮助:

    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().take() 进行分页,并使用与 CustomerId 上的 Customer 的外键关系优化 RegionCustomer 表(如果它不存在)。这应该是一个相当快的查询。

    还请务必查看Execution Plan 以查看 SQL Server 是否有任何建议。

    祝你好运!

    【讨论】:

    • 嗨,丹,感谢您的回复。在这种关系中,SelectMany 对我不起作用。它只允许我直接选择返回正确的数据 (EntitiesManager.RegionCustomers.Where(function(regionCustomer) regionCustomer.RegionID = CurrentUserRegionID).Select(function(regionCustomer) regionCustomer.Customers).ToList()) 但是这个实际上比原来的方式慢吗?
    • 有趣的是 SelectMany 不起作用。让我想知道这是 VB 的事情还是什么......
    • 如果这是您的问题,我会更新我的答案,但是您是否有理由不将其映射为像这样的多对多关系?似乎您真正想做的是类似于 EntitiesManager.Customers.Where(function(customer) customer.Regions.Any(function(region) region.RegionID = CurrentUserRegionID).ToList()
    • @Raven:如果以上是您想要的,请查看:msdn.microsoft.com/en-us/library/dd742359.aspx 您将要删除 RegionCustomerID。这是假设您正在使用设计器而不是在其他任何地方使用 RegionCustomerID。如果您先编写代码,则可以使用配置来执行此操作,而无需删除 RegionCustomerID。如果这是您想要的,请查看以下答案:stackoverflow.com/a/11382958/412339
    • @Raven:我确信您的数据库设计适合您的情况,但我很好奇; Customer -> Region 真的是多对多的吗?在大多数情况下(同样,我不知道你的情况),客户到区域将是一对多的,而 RegionID 可以被带到客户表中。有了这个,我确实知道客户可能位于多个地区的一些场景。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-16
    • 1970-01-01
    • 2014-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多