Преобразование оператора foreach в оператор выбора

У меня есть код, написанный в цикле 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();

В каком смысле это не работает? Вы получаете ошибку? Неожиданный результат? Что-то другое?

David 01.08.2024 22:26

Понимаете ли вы, что вы выполнили N*4 запроса и с помощью правильного запроса LINQ вы можете сделать это эффективно? Принятый ответ усугубляет проблему.

Svyatoslav Danyliv 01.08.2024 22:42
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
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 для типов коллекций в памяти или только для простейших сопоставлений таблиц => объектов.

Другие вопросы по теме

Похожие вопросы

Что происходит, когда несколько задач C# запускаются после завершения другой задачи?
ASP .NET Core — расширение @Html.EditorFor для добавления <span>
Netwonsoft JsonConvert.Deserialization выдает исключение JsonSerializationException: «Ошибка преобразования значения «Имя моего пользовательского объекта» в тип «System.Type»
Как обеспечить автоматическое масштабирование для CollectionView в объекте Popup из CommunityToolkit.Maui после его заполнения с помощью события нажатия кнопки на платформе Windows?
Перенаправление вызова .NET Core OIDC не работает с интерфейсом Angular
Как добавить несколько веб-приложений Blazor в существующий веб-API
Веб-приложение .Net 8 Blazor (сервер) -> Начните с языка браузера и разрешите пользователю менять язык через раскрывающийся список
Что означает этот вариант значка проекта CsProj в обозревателе решений Visual Studio 2022?
Передача массива объектов из C# в VBA Excel
Как я могу читать статические свойства из экземпляров классов?