2016-08-04 36 views
0

使用实体框架代码首先我有客户的DbSet,每个客户都有一个客户编号:ID为实体框架查询项目自IEnumerable

public class Customer 
{ 
    public int CutomerId {get; set;} 
    ... 
} 

public class MyDbContext : DbContext 
{ 
    public DbSet<Customer> Customers {get; set; 
} 

所有相当标准。

不知何故,我选择了一系列customerIds作为IEnumerable。我想用这个customerId来查询所有客户,以便与选定的客户进行一些沉重的LINQ工作。所以,我需要这样的东西:

IEnumerable<int> customerIdsToProcess = ... 
using (var myContext = new MyDbContext()) 
{ 
    IQueryable<Customer> selectedCustomers = myContext.Customers 
     .Where(customer => customerIdsToProcess.Contains(customer.customerId); 

然而,使用在SQL语句中,如果集合很大,不能使用Enumerable.Contains结果。

那么如果你有一个ID集合并且你想得到一个带有该ID的元素的IQueryable,该怎么办?

加法:想过之后,这个问题有点假设。通常情况下,本地没有数千个ID,除非它们是查询的结果,因此可用IQueryable表示。所以,尽管知道如何做到这一点很好,但如果我真的需要它,我想我会做错事。

+0

如何分割你的列表,根据列表获取查询,然后结合查询? –

回答

1
IQueryable<Customer> selectedCustomers = myContext.Customers 
    .Where(customer => customerIdsToProcess.Any(x=>x.customerId==customer.customerId)); 
1
IEnumerable<int> customerIdsToProcess = ... 

using (var myContext = new MyDbContext()) 
{ 
    var selectedCustomers = myContext.Customers 
     .Join(customerIdsToProcess,x=>x.CustomerId, y=>y,(x,y)=>x).ToList(); 
} 

可以使用Join检索这些都是CustomerIdcustomerIdsToProcess

在上面的例子中

,你需要调用ToList()所有的客户,其他的聪明人,你不能使用selectedCustomers为未来的操作,using的外侧。