代码之家  ›  专栏  ›  技术社区  ›  Vasu V

将foreach转换为select语句

  •  -1
  • Vasu V  · 技术社区  · 10 月前

    我在foreach循环中编写了以下代码,我想将其转换为linq-select方法。

    List<BidderDataDTO> bidsData = new List<BidderDataDTO>();
    
    if(bidderDatas.Count > 0)
    {
        foreach (var bidderData in bidderDatas)
        {
            var data = new BidderDataDTO();
    
            data.TenderId = bidderData.TenderId;
            data.ClosingDate = _context.Tenders.Where(x => x.Id == tenderid).Select(x => x.ClosingDate).FirstOrDefault();
            data.FullName = _context.Users.Where(x => x.Userid == bidderData.CreatedUser).Select(x => x.Firstname + " " + x.Lastname).FirstOrDefault();
            data.Price = bidderData.Price;
    
            bidsData.Add(data);
        }
    }
    

    我试着跟随,但不起作用。所以,对此有什么想法吗

     bidderDatas.Select(x => new BidderDataDTO()
     {
         TenderId = x.TenderId,
         ClosingDate = _context.Tenders.Where(x => x.Id == tenderid).Select(x => x.ClosingDate).FirstOrDefault(),
         CompanyName = _context.Companies.Where(x => x.Id == x.CompanyId).Select(x => x.CompanyName).FirstOrDefault(),
         FullName = _context.Users.Where(x => x.Userid == x.CreatedUser).Select(x => x.Firstname + " " + x.Lastname).FirstOrDefault(),
         Price = x.Price,
         Email = _context.Users.Where(x => x.Userid == x.CreatedUser).Select(x => x.Email).FirstOrDefault(),
     }).ToList();
    
    1 回复  |  直到 10 月前
        1
  •  0
  •   Joel Coehoorn    10 月前
    var bidsData = bidderDatas.Select( bd => new BidderDataDTO() {
            TenderId = bd.TenderId,
                             // I think you may want  "bd.TenderId" here  ˇ
            ClosingDate = _context.Tenders.FirstOrDefault(x => x.Id == tenderid)?.ClosingDate,
            CompanyName = _context.Companies.FirstOrDefault(x => x.Id == x.CompanyId)?.CompanyName,
            FullName = _context.Users.FirstOrDefault(x => x.userid == bd.CreatedUser)?.Select(x => $"{x.Firstname} {x.Lastname}")
            Price = bd.Price,
            Email = _context.Users.FirstOrDefault(x => x.Userid == x.CreatedUser)?.Email
       });
    

    请注意,这会创建一个 IEnumerable 而不是a List ,但这通常 更好的 ,如果你 真正地 需要一个你可以打电话的列表 .ToList() 为了得到它。

    我们可能可以通过扩展lambda来避免需要调用来进一步提高性能 FirstOrDefault() 在同一个 Users 收集不止一次。但如果我 真正地 关心性能,我会编写原始SQL。我倾向于将linq查询保留给内存中的集合类型,或者只保留最简单的表=>对象映射。