C # - значение логического свойства не изменится :( - PullRequest
1 голос
/ 07 октября 2019

Я устанавливаю начальное значение boolean (только из-за тестирования) в моем методе Map, поэтому я установил HasChildrens значение на true, чтобы я мог проверить позже в своем приложении, когда я вручную изменю этозначение это действительно изменится, потому что я подозревал, что он не меняется .. И, к сожалению, я был прав: /

Поток идет так:

public async Task<IEnumerable<CompDTO>> GetCompanies()
{
     var companies = await _context.Companies.ToListAsync();

     var result = GetMappedData(companies);

     foreach (CompDTO comp in result)
     {
        comp.HasChildrens = false;
     }

   return result;
}


private IEnumerable<CompDTO> GetDataMapped(IEnumerable<Company> companiesList)
{
    return companiesList.Select(company => Map(company));
}


private CompDTO Map(Company company)
{
    return new CompDTO()
    {
        Id = company.Id,
        Title = company.Title,
        ParentCompanyId = company.ParentCompanyId,
        HasChildrens = true
    };
}

И каждый раз, когда я проверяю результат из моегоGetCompanies() метод и значение HasChildrens, я действительно уверен, что это всегда правда! Даже если я написал в своем методе comp.HasChildrens = false;

Это действительно вызывает у меня головную боль: D

Спасибо за любую помощь!

Приветствия

1 Ответ

2 голосов
/ 07 октября 2019

This:

var result = GetMappedData(companies);

сохраняет запрос в переменную result, а не результаты запроса. Это связано с тем, что GetMappedData возвращает запрос для начала, а не объект, который реализует интерфейс IEnumerable (например, List).

В следующей строке цикл foreach перечисляет запростаким образом, запрос, наконец, начинает выполняться. Он успешно изменяет свойство HasChildrens каждого элемента, но сама последовательность никуда не денется.

На следующей строке вы возвращаете result, что, опять же, является запросом, а не результатомзапрос. Когда вызывающий GetCompanies() пытается перечислить этот запрос, он снова начинает перечисление, создавая новую последовательность различных экземпляров CompDTO, и на этот раз нет цикла foreach для их изменения перед продолжением, поэтому вы наблюдаетезначение свойства как false.

Материализуйте свой запрос при первом вызове:

var result = GetMappedData(companies).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...