代码之家  ›  专栏  ›  技术社区  ›  IbrarMumtaz

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

  •  0
  • IbrarMumtaz  · 技术社区  · 6 年前

    // produces 8 results
                var qryResults =
                    (from r in dbContext.Routes
                     join br in dbContext.BrokerRoutes on r.RouteId equals br.RouteId
                     join pr in dbContext.RoutePathFilters.Include(x => x.PathFilter) on r.RouteId equals pr.RouteId into paths
                     where br.Broker.ApiKey == apiKey
                     select new RouteTemplate
                        {
                            RouteId = r.RouteId,
                            Version = r.Version.Version,
                            Url = r.Url,
                            IsActive = r.IsActive,
                            Paths = paths.Select(x => x.PathFilter.FilterName).ToList()
                     })
                    .AsNoTracking()
                    .ToImmutableList();
    
    // takes 8 results and turns that into 2 overall objects.
                var results = new List<RouteTemplate>();
                foreach (var r in qryResults)
                {
                    if (results.All(x => x.RouteId != r.RouteId))
                    {
                        r.Paths = qryResults
                            .Where(x => x.RouteId == r.RouteId)
                            .Select(x => x.Paths.First()).ToList();
                        results.Add(r);
                    }
                }
    

    r paths

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

    0 回复  |  直到 6 年前
        1
  •  1
  •   NetMage    6 年前

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

    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();