如果可能的话,我需要将此代码转换为一个请求。
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));
但我有不同的数量。
答案 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));
虽然我不知道为什么你需要查询两个来源。