Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.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
C# 在实体框架中使用contain In where语句会导致性能过低_C# - Fatal编程技术网

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在服务器上运行。