C# 如何在.Select-LINQ中填充一个额外属性

C# 如何在.Select-LINQ中填充一个额外属性,c#,linq,ienumerable,dto,C#,Linq,Ienumerable,Dto,我使用Map方法从我的上下文类公司创建DTO对象,如下所示: private CompDTO Map(Company company) { return new CompDTO() { Id = company.Id, Title = company.Title, ParentCompanyId = company.ParentCompanyId, }; } public class CompDTO { publ

我使用Map方法从我的上下文类公司创建DTO对象,如下所示:

private CompDTO Map(Company company)
{
    return new CompDTO()
    {
        Id = company.Id,
        Title = company.Title,
        ParentCompanyId = company.ParentCompanyId,
    };
} 
public class CompDTO
{
    public long Id { get; set; }
    public string Title { get; set; }
    public long? ParentCompanyId { get; set; }
    public bool HasChildrens { get; set; }
}
CompDTO看起来像这样:

private CompDTO Map(Company company)
{
    return new CompDTO()
    {
        Id = company.Id,
        Title = company.Title,
        ParentCompanyId = company.ParentCompanyId,
    };
} 
public class CompDTO
{
    public long Id { get; set; }
    public string Title { get; set; }
    public long? ParentCompanyId { get; set; }
    public bool HasChildrens { get; set; }
}
我这样使用它,基本上接收公司列表并调用另一个Map方法,该方法将从我的公司对象创建DTO对象,我的主要问题是公司类不包含HasChildrens属性,所以我必须以某种方式填充它,我无法在映射其他道具的地方执行此操作,因为在那里我无法访问公司列表

private IEnumerable<CompDTO> Map(IEnumerable<Company> companies)
{
    // Mapping all properties except HasChildrens because it does not exist in Company object so I decided to map it later

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

    // Here I wanted to return all previously mapped objects + I would like to add to each object HasChildren property, but obliviously my syntax is not good:

    return result.Select(c => new { c, c.HasChildrens = companies.Any(cc => cc.ParentCompanyId == c.Id) });
}
但仍然存在一些问题

基本上,我只想为每个映射的DTO添加HasChildren,并在Map方法中添加时返回它

任何形式的帮助都会很好


谢谢

您的方法private IEnumerable MapIEnumerable Companys的返回类型为IEnumerable

所以问题是您返回的是匿名类型,而不是预期的CompDTO

更改返回结果。选择C=>new{…}

编辑:

实际问题是:

从db类转换到dto类时,如何在CompDTO中设置属性HasChildrens

我认为最常见的解决方法是在转换时传入值:

private CompDTO Map(Company company, bool hasChildrens) {
    return new CompDTO()
    {
        Id = company.Id,
        Title = company.Title,
        ParentCompanyId = company.ParentCompanyId,
        HasChildrens = hasChildrens
    };
}
您也可以在事实发生后迭代结果,并将haschilderns设置为:我不建议这样做

foreach(dto in result) {
   dto.HasChildrens = ...
}
您还可以在Map方法中插入获取haschilderns值的逻辑:我也不建议这样做

private CompDTO Map(Company company, IEnumerable<Company> companies) {
    return new CompDTO()
    {
        Id = company.Id,
        Title = company.Title,
        ParentCompanyId = company.ParentCompanyId,
        HasChildrens = companies
                       .Any(c => c.ParentCompanyId == company.Id) 
    };
}

但我不想再次重复所有新的CompDTO,我只想添加HasChildrens,因为之前添加了其他属性:我的回答主要针对您的错误消息“无效的匿名类型声明器”。如果要在从数据库类转换到dto类时设置HasChildrens属性。然后我会将该值传递到DTO的构造函数中。您也可以将haschilderns=companys.Anycc=>cc.ParentCompanyId==c.Id添加到Map方法中。。尽管有一点代码的味道导致了这个问题