首页 > 解决方案 > 如何在 .Select 中填充一个额外的属性 - LINQ

问题描述

我正在使用我的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方法,该方法将从我的公司对象创建DTO对象,对我来说主要问题是Company该类does not contain 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) });
}

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

我也尝试像这样添加 HasChildrens:

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

但是还是有问题。。

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

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

谢谢

标签: c#linqienumerabledto

解决方案


您的方法的返回类型private IEnumerable<CompDTO> Map(IEnumerable<Company> companies)IEnumerable<CompDTO>

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

改变return result.Select(c => 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) 
    };
}

推荐阅读