LINQ - для каждого элемента в выбранном значении заполнить одно незаселенное свойство - PullRequest
0 голосов
/ 06 октября 2019

Я использую мой Map метод для создания DTO объекта из моего контекстного класса Company, и отображение выглядит так:

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

CompDTO выглядит так:

public class CompDTO
{
    public long Id { get; set; }
    public string Title { get; set; }
    public long? ParentCompanyId { get; set; }
    public bool HasChildrens { get; set; }
}

Вот как я вызываю метод Map:

private IEnumerable<CompDTO> Map(IEnumerable<Company> companies)
{

    var result = companies.Select(c => Map(c));

     return result.Select(c => { c.HasChildrens = companies.Any(cc => cc.ParentCompanyId == c.Id)});
 }

После основного сопоставления я пытаюсь заполнить свойство HasChildrens в моем return result.Select для каждого элемента compDTO.

Но это не работает, потому что он говорит: enter image description here

Но я думаю, есть более глубокая проблема, потому что я добавил просто тест, как этот:

return result.Select(c => { c.HasChildrens = true; }); 

И он сказал: Аргументы типа для метода не могут быть получены из использования.

Любая помощь была бы удивительной

1 Ответ

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

Предполагается, что IEnumerable Select создает новую последовательность из входных данных. Если вы хотите просто изменить свойство, используя Select как foreach, вам нужно вернуть объект, переданный в вашу лямбду

 return result.Select(c => 
               { 
                   c.HasChildrens = companies.Any(cc => cc.ParentCompanyId == c.Id);
                   return c;
               });

Но вы действительно предпочитаете этот подход простому циклу For Loop? Я нахожу это более ясным

foreach(Company c in result)
    c.HasChildrens = companies.Any(cc => cc.ParentCompanyId == c.Id);

return result;
...