[英]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.