Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将linq请求(查询)转换为一个不带foreach的请求_C#_.net_Linq_Foreach - Fatal编程技术网

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
中选择了。@user2889383
o
in
o.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));