在实体框架中使用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
我想用另一种方式编写这样的代码,但要有高性能?
您正在将所有列表下载到客户端,然后在内存中对它们进行过滤。
这违背了实体框架的目的。
你应该直接对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));
但是,您应该考虑是否可以在数据库中这样做。