【问题标题】:Convert linq requests (queries) into one request without foreach将 linq 请求(查询)转换为一个没有 foreach 的请求
【发布时间】:2013-11-25 20:01:28
【问题描述】:

如果可能的话,我需要将此代码转换为一个请求。

foreach (var obj in objs)
{
    if (obj.cars.Count > maxCars)
    { 
        var count = obj.cars.Count - maxCars;
        var cars = _carDao.GetQueryable()
                          .Where(v => v.obj.Id == obj.Id)
                          .OrderByDescending(v => v.CreatedDate)
                          .Take(count);
     }
}

count 有问题。我可以使用这个请求:

var ids = objs.Select(p=>p.Id);
var cars = _carDao.GetQueryable().Where(v => ids.Contains(v.obj.Id));

但我有不同的计数。

【问题讨论】:

  • 本地的countcars怎么办?最后一个项目会议obj.cars.Count > maxCars 将覆盖任何其他以前的分配

标签: c# .net linq foreach


【解决方案1】:

也许:

var query = objs
    .Where(o => o.cars.Count > maxCars)
    .SelectMany(o => _carDao.GetQueryable()
        .Where(v => v.obj.Id == o.Id)
        .OrderByDescending(v => v.CreatedDate)
        .Take(o.cars.Count - maxCars));

虽然我不知道你为什么需要查询两个来源。

【讨论】:

  • 也许.Where(v => o.obj.Id == v.Id) ?
  • @user2889383:不,反过来:.Where(v => v.obj.Id == o.Id)。不过你说得对,我两边都选错了o
  • @user2889383 o in o.Id 来自SelectMany,而不是来自Where
  • @TimSchmelter 谢谢!
【解决方案2】:

每当您看到自己执行查询时,然后对于每个项目对单个源进行另一个查询,它以某种方式“匹配”当前项目,这表明您应该使用 Join 操作(这适用不仅适用于 LINQ,而且几乎适用于任何关系数据库)。

var query = from obj in objs
    join car in _carDao.GetQueryable()
    on obj.Id equals car.obj.Id into cars
    select new
    {
        obj,
        cars = cars.OrderByDescending(v => v.CreatedDate)
            .Take(obj.cars.Count - maxCars),
    }

【讨论】:

  • 我错过了Where,除此之外,您的回答似乎比我的要好。至少效率更高。
  • @TimSchmelter 我没有看到需要第一个Where。这只是意味着您取的是负数,因此结果集合的大小为零。如果它确实存在很重要,则可以添加它。不知道它是如何使用的,很难说什么是正确的。
  • 我看到了这个需求,因为它是foreach 中的第一个if
猜你喜欢
  • 2017-04-02
  • 2020-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-30
  • 2018-04-16
  • 1970-01-01
相关资源
最近更新 更多