C# 如何将Linq Group By和Foreach语句重构为一个Linq查询
我在尝试将下面的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属
//获取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();