【问题标题】:How to populate one extra property in a .Select - LINQ [duplicate]如何在 .Select 中填充一个额外的属性 - LINQ [重复]
【发布时间】:2019-10-06 09:41:00
【问题描述】:

我正在使用我的Map 方法从我的上下文类Company 创建DTO 对象,它看起来像这样:

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 方法,该方法将从我的公司对象创建 DTO 对象,对我来说主要问题是 Companydoes not contain @987654331 @property,所​​以我必须以某种方式填充它,而我无法在映射其他道具的地方执行此操作,因为我无法访问公司列表。

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) });
}

我正在检索错误:无效的匿名类型声明符

我也尝试过像这样添加 HasChildrens:

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

但还是有问题..

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

任何形式的帮助都会很棒!

谢谢

【问题讨论】:

    标签: c# linq ienumerable dto


    【解决方案1】:

    你的方法private IEnumerable&lt;CompDTO&gt; Map(IEnumerable&lt;Company&gt; companies)的返回类型是IEnumerable&lt;CompDTO&gt;

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

    更改return result.Select(c =&gt; new { ... }

    return result.Select(c => new CompDTO { 
        Id = ...
        Title = ...
        ParentCompanyId = ...
        HasChildrens = ...
    })
    

    编辑:

    实际问题是:

    从 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
        };
    }
    

    您也可以在事后迭代结果并像这样设置 HasChildrens:(我不推荐这样做)

    foreach(dto in result) {
       dto.HasChildrens = ...
    }
    

    您还可以在 Map 方法中插入获取 HasChildrens 值的逻辑:(我也不推荐这样做)

    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 的构造函数。你也可以在你的 Map 方法中添加你的HasChildrens = companies.Any(cc =&gt; cc.ParentCompanyId == c.Id) .. 虽然有点代码味道
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-29
    • 1970-01-01
    • 1970-01-01
    • 2014-05-15
    • 1970-01-01
    • 2021-01-15
    相关资源
    最近更新 更多