在实体框架中使用contains In where语句会导致性能过低

本文关键字:语句 性能 where In 框架 实体 contains | 更新日期: 2023-09-27 18:07:00

我在数据库中有三个表:

Customer, SalesManTabels, CustomerSalesManTabels

现在我在实体框架和c#中使用此代码从Customer表中获取所有客户除了包含在同一销售人员的CustomerSalesmansTabel中的客户:

 List<CustomerSalesManTabel> CustomerSalesManList = new List<CustomerSalesManTabel>();
    List<Customer> CustomerList = new List<Customer>();
    MedicalCustomersDBEntities PuplicEntityForSave = new MedicalCustomersDBEntities();
     private void LoadCustomerSalesManToList()
     {  
      IEnumerable<CustomerSalesManTabel> Cus = from a in PuplicEntityForSave.CustomerSalesManTabels.Include("SalesManTabel") select a;
      CustomerSalesManList.AddRange(Cus);  
     }
     private void LoadCustomerToList()
     {
      MedicalCustomersDBEntities md = new MedicalCustomersDBEntities();
      IEnumerable<Customer> Cus = from a in md.Customers select a;
      CustomerList.AddRange(Cus);
      }
    IEnumerable<Guid?> CustomerSalesManIEnumerable = CustomerSalesManList.AsEnumerable().Where(s => s.SalesManId == SalesManId).Select(s => s.CustomerId);
     var Cus = from nb in CustomerList
      where CustomerSalesManIEnumerable.Contains(nb.Id) == false
      select nb;
    checkedListBoxControlNonSelected.ValueMember = "Id";
    checkedListBoxControlNonSelected.DisplayMember = "FirstName";
    checkedListBoxControlNonSelected.DataSource = Cus.ToList<Customer>();

这段代码工作,但我的问题与Contains,因为我有一个巨大的数据,我有12000 Customer当我使用Contains它需要太长时间当我分配"cus"的DataSourceof checklistbox

我想用另一种方式编写这样的代码,但要有高性能?

在实体框架中使用contains In where语句会导致性能过低

您正在将所有列表下载到客户端,然后在内存中对它们进行过滤。
这违背了实体框架的目的。

你应该直接对DataContext运行你的查询:

from c in entities.Customers
where !entites.CustomerSalesManTabels.Any(s => c.Id == s.CustomerId)
select c

首先,您正在循环使用比您需要的更多,因为您没有实现CustomerSalesManIEnumerable的结果,因此每次使用Contains时,它都会从CustomerSalesManList中查看整个结果(这是由AsEnumerable实现的)。

将结果实现为列表可以减少需要浏览的数据。当您希望在结果中查找项时,您需要一个使用散列的集合,以便获得快速查找,如HashSet:

HashSet<Guid?> CustomerSalesManIEnumerable = new HashSet(CustomerSalesManList.AsEnumerable().Where(s => s.SalesManId == SalesManId).Select(s => s.CustomerId));

但是,您应该考虑是否可以在数据库中这样做。