簡體   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