【问题标题】:How to pass a list to a LINQ query as search condition?如何将列表作为搜索条件传递给 LINQ 查询?
【发布时间】:2021-08-18 12:01:02
【问题描述】:

现在,我可以运行如下所示的 LINQ 查询:

 private Person PopulatePerson(Person person)
    {
        return (from er in context.Orders
               where er.personId == person.Id
                select new Person()
                {
                    Name = person.Name
                    Qty = er.OrderQty,
                }).FirstOrDefault();
    }

如果我将人员列表传递给上面的这个方法,就像下面一样?如何更改我的查询以对其进行迭代?

 private List<Person> PopulatePerson(List<Person> persons)
    {

    }

我可以foreachList&lt;Person&gt;,但它会多次连接到数据库。假设要取第一个结果。实际上这只是一个例子。实际上有许多重复的子记录,因此我只需要获取我设法获得的第一条记录。但是,如果我想将一个列表传递给查询以在 LINQ 内部进行迭代而不是在外部编写一个 foreach。

【问题讨论】:

  • 当一个人下了多个订单时,您希望退回什么?
  • 假设我想获得第一个结果。实际上这只是一个例子。实际上有许多重复的子记录,因此我只需要获取我设法获得的第一条记录。但是,如果我想将一个列表传递给查询以在 LINQ 内部进行迭代而不是在外部编写一个 foreach。

标签: c# linq entity-framework-core


【解决方案1】:

支持Contains,因此您需要将标识符选择到数组或列表等集合中:

private IList<Person> PopulatePersons(IEnumerable<Person> persons)
{
    string[] allIds = persons.Select(p => p.Id).ToArray();
    return (from er in context.Orders
            where allIds.Contains(er.PersonId)
            join p in context.Persons on er.PersonId equals p.Id
            group new { Qty = er.OrderQty, Name = p.Name} by er.PersonId into PersonIdGroup
            select new Person()
            {
                Name = PersonIdGroup.First().Name,
                Qty = PersonIdGroup.Sum(x => x.Qty)
            }).ToList();
}

我假设你想返回多个人,所以不仅仅是一个人。

【讨论】:

  • 每个订单将返回一个人。您可以使用 .Where(o =&gt; o.Id == o.Person.Orders.Max(o2 =&gt; o2.Id)) 之类的内容进行过滤
  • @JeremyLakeman:编辑了答案,我猜他需要这样的东西
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-23
相关资源
最近更新 更多