如何在.Select中填充一个额外的属性-LINQ [英] How to populate one extra property in a .Select - LINQ

查看:284
本文介绍了如何在.Select中填充一个额外的属性-LINQ的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm using my Map method to create DTO object from my context class Company and it looks like this:

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 属性,所以我必须以某种方式填充它,而在映射其他道具的地方无法这样做,因为在那里我无法访问公司列表.

I'm using it like this, basically receiving list of companies and calling another Map method which would create DTO object from my company objects and main issue for me is that Company class does not contain HasChildrens property, so I have to populate it somehow, and I couldn't do it where I'm maping other props because there I dont have access to a companies list.

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:

I've tried to add HasChildrens like this also:

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

但仍然存在问题.

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

Basically I simply want to add HasChildrens for each my Mapped DTO and return it as it was added in Map method.

任何一种帮助都会很棒!

Any kind of help would be great!

谢谢

推荐答案

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

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

So the issue is that you're returning an anonymous type rather than the expected CompDTO

更改return result.Select(c => new { ... }

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

实际问题是:

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

我想说,最常见的解决方法是在转换时传递值:

I'd say that the most common way to solve that is to pass in the value while converting:

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

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

You could also iterate the result after the fact and set the HasChildrens like so: (I wouldn't recommend this)

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

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

You could also insert the logic of obtaining the HasChildrens value inside of the Map method: (I wouldn't recommend this either)

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

这篇关于如何在.Select中填充一个额外的属性-LINQ的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆