C# 在实体框架中使用contain In where语句会导致性能过低
我在数据库中有三个表:C# 在实体框架中使用contain In where语句会导致性能过低,c#,C#,我在数据库中有三个表: Customer, SalesManTabels, CustomerSalesManTabels 现在我在EntityFramework和C中使用此代码从customer表中获取所有customer 同一销售人员的CustomerAlesmanstabel中包含的客户除外: List<CustomerSalesManTabel> CustomerSalesManList = new List<CustomerSalesManTabel>();
Customer, SalesManTabels, CustomerSalesManTabels
现在我在EntityFramework和C中使用此代码从customer表中获取所有customer
同一销售人员的CustomerAlesmanstabel中包含的客户除外:
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,因为我有一个巨大的数据,当我使用Contains时,我有12000个客户。当我将CU分配给数据源of checklistbox时,它花费的时间太长
我想用另一种方法来编写这样的代码,但要有高性能?您要将所有列表下载到客户端,然后在内存中过滤它们。 这违背了实体框架的目的 您应该直接针对DataContext运行查询:
from c in entities.Customers
where !entites.CustomerSalesManTabels.Any(s => c.Id == s.CustomerId)
select c
您正在将所有列表下载到客户端,然后在内存中过滤它们。 这违背了实体框架的目的 您应该直接针对DataContext运行查询:
from c in entities.Customers
where !entites.CustomerSalesManTabels.Any(s => c.Id == s.CustomerId)
select c
首先,您循环浏览的内容比您需要的多得多,因为您没有在CustomerAlesmaniEnumerable中实现结果,因此每次使用Contains时,它都会在CustomerAlesmaniEnumerable实现的CustomerAlesmanList中查看整个结果 将结果作为一个列表来实现,可以减少涉水的数据量。当您希望在结果中查找项时,您需要一个使用哈希的集合,以便快速查找,如哈希集:
你应该考虑是否可以在数据库中执行。
首先,你循环了很多,而不是你需要的,因为你没有在Cuffer-SaleMangiViable中实现结果。因此,每次使用Contains时,它都会出现在CustomerSalesManList的整个结果中,该结果是由一个可数函数实现的
将结果作为一个列表来实现,可以减少涉水的数据量。当您希望在结果中查找项时,您需要一个使用哈希的集合,以便快速查找,如哈希集:你应该考虑是否可以在数据库中做。
从In x选择a中没有任何理由来编写。你完全滥用EF。从In x选择A中没有任何理由来编写。你完全滥用EF。+ 1 -确切地-在UI上呈现12个用户,供用户选择。疯狂…亲爱的,我使用select join,但是当我使用contains with select join时,程序太慢了。我能做什么请Enumerable CustomerAlesmaniEnumerable=CustomerAlesmanList.AsEnumerable.Where=>s.SalesManId==SalesManId.Selects=>s.CustomerId;var Cus=来自CustomerList中的nb,其中CustomerAlesmaniEnumerable.Containsnb.Id==false选择nb;正如我一直试图告诉你的那样,这是完全错误的。您需要通过直接查询DataContext在服务器上运行。+1-准确-在用户界面上显示12000名客户供用户选择-疯狂…亲爱的,我使用select join,但当我使用contains with select join时,程序速度太慢。我能做些什么CustomerSalesManIEnumerable=CustomerSalesManList.AsEnumerable.Where=>s.SalesManId==SalesManId.Selects=>s.CustomerId;var Cus=来自CustomerList中的nb,其中CustomerAlesmaniEnumerable.Containsnb.Id==false选择nb;正如我一直试图告诉你的那样,这是完全错误的。您需要通过直接查询DataContext在服务器上运行。