![](/img/trans.png)
[英]LINQ Query - How to map a resultset into another object using Select
[英]How to map to another object list with help of linq lambda select
我在某个时候停下来,我不知道如何将项目的 map 列表转换为 ProjectResponse object 的列表。 ProjectResponse 是 Project model class 及其技术上的 DTO object 的缩短版本。
这是事情
public async Task<IEnumerable<ClientResponse>> Handle(GetClientsQuery query, CancellationToken cancellationToken)
{
List<Client> clientsDb = await _context.Clients.Include(x => x.Projects).Where(client => !client.IsDeleted).ToListAsync();
Result<List<UserData>> clientsIdentity = await _identityService.GetClients(clientsDb.Select(x => x.IdentityId).ToList());
List<ClientResponse> clients = new List<ClientResponse>();
foreach (var client in clientsIdentity.Data)
{
clients.Add(new ClientResponse
{
//two properties are filling up from clientsIdentity.Data
Email = client.Email,
Name = client.Name,
//second two from clientsDb
Id = clientsDb.FirstOrDefault(x => x.IdentityId.Equals(client.Id)).Id,
//One client has multiple projects (List<Project>)
//List<Project> need to be transformed and packed to List<ProjectResponse> (it's a dto object for Project model)
Projects = clientsDb.Where(x => x.IdentityId.Equals(client.Id)).Select(x => new ProjectResponse
{
//it shouldnt be FirstOrdefault - it now picksup always just from the first one, it should be some kind of foreach of projects..
Id = x.Projects.FirstOrDefault().Id,
Code = x.Projects.FirstOrDefault().Code,
Name = x.Projects.FirstOrDefault().Name,
}).ToList()
});
}
return clients;
}
所以我只设法到 map FirstOrDefault
object,但基本上我需要遍历 CLient 拥有的每个项目,并将 map 添加到新的 ClientResponse 项目中。
我认为您的问题是,对于迭代中的每个客户,您都会检索许多客户。 它应该只有一个具有该 ID 的,因此应该使用 First、Single、FirstOrDefault 等方法,然后您可以转换项目:
//...
Projects = clientsDb.Single(x => x.IdentityId.Equals(client.Id)).Projects.Select(x => new ProjectResponse...
或者,如果您在Client
和Project
之间有一个导航属性,您可以像这样使用它:
//...
Projects = client.Projects.Select(x => new ProjectResponse...
看起来好像你放错了地方。
通过查看代码和阅读您的问题,我的印象是 client.Id 是独一无二的,并且可以有许多与之相关的项目。 所以这个块:
Projects = clientsDb.Where(x => x.IdentityId.Equals(client.Id)).Select(x => new ProjectResponse
{
//it shouldnt be FirstOrdefault - it now picksup always just from the first one, it should be some kind of foreach of projects..
Id = x.Projects.FirstOrDefault().Id,
Code = x.Projects.FirstOrDefault().Code,
Name = x.Projects.FirstOrDefault().Name,
}).ToList()
具体来说, clientsDb.Where
在实际情况下返回一个集合,您只希望一个客户端匹配该 Id。
在没有实际尝试您的代码的情况下,我认为如果您将其更改为这些方面的内容(正如我在对您的问题的评论中提到的, Single
可能对您的业务逻辑更具表现力):
Projects = clientsDb.FirstOrDefault(x => x.IdentityId.Equals(client.Id)).Select(x => x.Projects).ToList()
当然,假设 Projects 和 x.Projects 是同一类型。 您可能仍然需要排除 ProjectResponse,但现在您当然不会处理集合中的集合:
{
//it shouldnt be FirstOrdefault - it now picksup always just from the first one, it should be some kind of foreach of projects..
Id = x.Id,
Code = x.Code,
Name = x.Name,
}).ToList()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.