具有来自IEnumerable的Id的实体框架查询项

时间:2016-08-04 07:10:14

标签: entity-framework linq

首先使用实体​​框架代码我有一个客户的DbSet,每个客户都有一个CustomerId:

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);

但是,使用Enumerable.Contains会导致SQL IN语句,如果集合很大,则无法使用该语句。

那么如果你有一个ID集合并且想要获得具有该Id的IQueryable元素该怎么办?

  

添加:在考虑之后,这个问题有点假设。通常情况下,本地没有数千个ID,除非它们是查询的结果,因此可以在IQueryable中表示。因此,虽然知道如何做到这一点会很好,但我想如果我确实需要的话,我做错了。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

 def create_server(conn):
    print("Create Server:")

    image = conn.compute.find_image("cirros")
    flavor = conn.compute.find_flavor("m1.tiny")
    network = conn.network.find_network("test")

    server = conn.compute.create_server(
            name="test", image_id=image.id, flavor_id=flavor.id,
            **addresses={"private":[
                            {"addr":"129.0.1.101","version":4},
                            {"addr":"129.0.1.103","version":4}
                            ]},**
            networks=[{"uuid": network.id}])

    server = conn.compute.wait_for_server(server)

您可以使用IEnumerable<int> customerIdsToProcess = ... using (var myContext = new MyDbContext()) { var selectedCustomers = myContext.Customers .Join(customerIdsToProcess,x=>x.CustomerId, y=>y,(x,y)=>x).ToList(); } 检索JoinCustomerId

的所有客户

在上面的示例中,您需要调用customerIdsToProcess,否则您无法使用ToList()进行将来操作selectedCustomers