Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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 Group By和Foreach语句重构为一个Linq查询_C#_Linq_Linq To Entities_Entity Framework Core - Fatal编程技术网

C# 如何将Linq Group By和Foreach语句重构为一个Linq查询

C# 如何将Linq Group By和Foreach语句重构为一个Linq查询,c#,linq,linq-to-entities,entity-framework-core,C#,Linq,Linq To Entities,Entity Framework Core,我在尝试将下面的LINQ查询重构为一个查询时遇到一些问题: //获取8个结果并将其转换为2个总体对象。 var results=新列表(); foreach(qryResults中的var r) { if(results.All(x=>x.RouteId!=r.RouteId)) { r、 路径=qryResults .其中(x=>x.RouteId==r.RouteId) .Select(x=>x.Paths.First()).ToList(); 结果:添加(r); } } r由path属

我在尝试将下面的LINQ查询重构为一个查询时遇到一些问题:

//获取8个结果并将其转换为2个总体对象。
var results=新列表();
foreach(qryResults中的var r)
{
if(results.All(x=>x.RouteId!=r.RouteId))
{
r、 路径=qryResults
.其中(x=>x.RouteId==r.RouteId)
.Select(x=>x.Paths.First()).ToList();
结果:添加(r);
}
}
r
path
属性中保存的每个值复制


我知道foreach可以合并到上面的linq查询中,但我已经尝试了几个小时了。因此,我很有兴趣知道这是否可能,以及如何做到这一点?

没有实际的数据库,我不确定这是否可行,但以下是我的尝试:

var qryResults =
    (from r in dbContext.Routes
     join br in dbContext.BrokerRoutes on r.RouteId equals br.RouteId
     where br.Broker.ApiKey == apiKey
     join pr in dbContext.RoutePathFilters.Include(x => x.PathFilter) on r.RouteId equals pr.RouteId into paths
     group new { r, paths } by r.RouteId into rprg
     let r = rprg.First().r
     select new RouteTemplate {
         RouteId = rprg.Key,
         Version = r.Version.Version,
         Url = r.Url,
         IsActive = r.IsActive,
         Paths = rprg.Select(rpr => rpr.paths.First().PathFilter.FilterName).ToList()
     })
    .AsNoTracking()
    .ToImmutableList();

当您尝试直接在ImmutableList上使用ForEach LINQ方法时会发生什么?@StormHash-这提供了另一个选项-ty-让我试试。酷,让我知道它是否有效。这就是我想做的,将foreach内部的代码重构成一个方法,并使用foreach LINQ方法将列表中的每个元素传递给内部方法。我在本期中再次运行了这个方法,最简单的答案是删除投影语句,只需从
rprg
中进行选择。另外:
rprg.First().r
将始终为集合中的每个对象指定相同的值。如果
版本
url
信息不同,则只会对投影到select语句中的每个结果对象进行重写。@IbrarMumtaz您的代码仅为每组
路由ID
将第一个
路由ID
添加到
结果
,与此LINQ相同。
var qryResults =
    (from r in dbContext.Routes
     join br in dbContext.BrokerRoutes on r.RouteId equals br.RouteId
     where br.Broker.ApiKey == apiKey
     join pr in dbContext.RoutePathFilters.Include(x => x.PathFilter) on r.RouteId equals pr.RouteId into paths
     group new { r, paths } by r.RouteId into rprg
     let r = rprg.First().r
     select new RouteTemplate {
         RouteId = rprg.Key,
         Version = r.Version.Version,
         Url = r.Url,
         IsActive = r.IsActive,
         Paths = rprg.Select(rpr => rpr.paths.First().PathFilter.FilterName).ToList()
     })
    .AsNoTracking()
    .ToImmutableList();