C# 如何在.Select-LINQ中填充一个额外属性
我使用Map方法从我的上下文类公司创建DTO对象,如下所示: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
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方法中。。尽管有一点代码的味道导致了这个问题