将linq请求(查询)转换为一个请求而无需foreach

时间:2013-11-25 20:01:28

标签: c# .net linq foreach

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

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

但我有不同的数量。

2 个答案:

答案 0 :(得分:0)

每当您看到自己执行查询,然后对每个项目进行另一个查询到单个源,它以某种方式“匹配”当前项目时,这是一个标志,您应该使用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),
    }

答案 1 :(得分:0)

也许:

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

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