繁体   English   中英

How to map to another object list with help of linq lambda 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...

或者,如果您在ClientProject之间有一个导航属性,您可以像这样使用它:

//...
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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM