LINQ-对于选择的每个项目,将值填充为一个未填充的属性

时间:2019-10-06 10:17:15

标签: c# linq linq-to-entities ienumerable

我正在使用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属性。

但是它不起作用,因为它说: [1]: https://i.stack.imgur.com/T7D3A.png

但是我想还有一个更深层次的问题,因为我只是添加了这样的测试:

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

它说:不能从用法中推断出方法的类型参数。

任何一种帮助都很棒

1 个答案:

答案 0 :(得分:2)

IEnumerable Select应该从输入创建一个新序列。如果您只是想使用Select作为一个foreach来更改属性,则需要返回传递给lambda的对象

 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;