C# 将linq请求(查询)转换为一个不带foreach的请求
如果可能的话,我需要将此代码转换为一个请求C# 将linq请求(查询)转换为一个不带foreach的请求,c#,.net,linq,foreach,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)
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);
}
}
我对计数有问题。我可以使用此请求:
var ids = objs.Select(p=>p.Id);
var cars = _carDao.GetQueryable().Where(v => ids.Contains(v.obj.Id));
但我有不同的计数。每当您看到自己执行一个查询,然后对每个项进行另一个查询,并以某种方式“匹配”当前项,这表明您应该使用
连接操作(这不仅适用于LINQ,而且几乎适用于任何关系数据库的使用)
也许:
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));
虽然我不知道你为什么需要查询两个来源。你如何处理本地计数和汽车?最后一个项目会议obj.cars.Count>maxCars
将覆盖以前的任何分配我缺少Where
,除此之外,你的答案似乎比我的好。至少效率更高。@TimSchmelter我不认为有必要使用第一个Where
。这只意味着你取的是一个负数,因此结果集合的大小为零。如果它真的存在很重要,那么它可以被添加进去。如果不知道这是如何使用的,就很难说什么是正确的。我认为这是必要的,因为它是foreach
中的第一个if
。可能是。Where(v=>o.obj.Id==v.Id)
?@user2889383:不,相反:。Where(v=>v.obj.Id==o.Id)
。但你是对的,我错误地从两边的o
中选择了。@user2889383o
ino.Id
来自SelectMany
,而不是Where
@TimSchmelter谢谢!
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));