У меня есть код, написанный в цикле foreach, я хочу преобразовать его в метод выбора linq.
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();
Понимаете ли вы, что вы выполнили N*4 запроса и с помощью правильного запроса LINQ вы можете сделать это эффективно? Принятый ответ усугубляет проблему.
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
вместо List
, но зачастую это лучше, и если вам действительно нужен список, вы можете вызвать .ToList()
, чтобы получить его.
Вероятно, мы могли бы еще немного улучшить производительность, расширив лямбду, чтобы избежать необходимости вызывать FirstOrDefault()
для одной и той же Users
коллекции более одного раза. Но если бы меня действительно заботила производительность, я бы написал чистый SQL. Я склонен резервировать запросы linq для типов коллекций в памяти или только для простейших сопоставлений таблиц => объектов.
В каком смысле это не работает? Вы получаете ошибку? Неожиданный результат? Что-то другое?