c# - 如何在 .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 方法中添加的。
任何形式的帮助都会很棒!
谢谢
解决方案
您的方法的返回类型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)
};
}
推荐阅读
- arrays - 无论索引顺序如何,如何比较数组中的值是否相似
- typescript - Typescript 可扩展的泛型类型/接口
- django - Django Admin 选择引发验证错误
- c++ - 是否可以将智能指针的内存重用于另一个对象?
- java - 为 iOS 运行 Java 依赖的 Kotlin
- tensorflow - 如何在神经网络中添加“OTHER”类?
- python-3.x - 如何使用列名查找 groupby pandas 的最大值
- java - 我可以在 Android Sdk<=26 中使用 java 时间库的所有功能吗
- laravel - bootstrap和laravel的图片轮播中只显示一张图片
- flutter - Flutter 理解模型