【问题标题】:Entity Framework Query Items with Id from IEnumerable具有来自 IEnumerable 的 Id 的实体框架查询项
【发布时间】:2016-08-04 17:56:41
【问题描述】:

首先使用实体​​框架代码我有一个客户的 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 中表示。因此,尽管知道如何执行此操作会很好,但如果我真的需要它,我想我做错了。

【问题讨论】:

  • 如何拆分列表,根据该列表获取查询,然后合并查询?

标签: entity-framework linq


【解决方案1】:
IQueryable<Customer> selectedCustomers = myContext.Customers
    .Where(customer => customerIdsToProcess.Any(x=>x.customerId==customer.customerId));

【讨论】:

    【解决方案2】:
    IEnumerable<int> customerIdsToProcess = ...
    
    using (var myContext =  new MyDbContext())
    {
        var selectedCustomers = myContext.Customers
            .Join(customerIdsToProcess,x=>x.CustomerId, y=>y,(x,y)=>x).ToList();
    }
    

    您可以使用Join 检索在customerIdsToProcess 中具有CustomerId 的所有客户

    在上面的例子中,你需要调用ToList(),否则你不能在using之外使用selectedCustomers来进行以后的操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 2012-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多