C# 如何借助linq lambda select映射到另一个对象列表
我在某个点上停了下来,我不知道如何将项目列表映射到ProjectResponse对象列表。 ProjectResponse是Project model类的一个缩短版本,从技术上讲,它是DTO对象 事情是这样的C# 如何借助linq lambda select映射到另一个对象列表,c#,linq,asp.net-core,C#,Linq,Asp.net Core,我在某个点上停了下来,我不知道如何将项目列表映射到ProjectResponse对象列表。 ProjectResponse是Project model类的一个缩短版本,从技术上讲,它是DTO对象 事情是这样的 public async Task<IEnumerable<ClientResponse>> Handle(GetClientsQuery query, CancellationToken cancellationToken) { List<Clien
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;
}
公共异步任务句柄(GetClientsQuery查询,CancellationToken CancellationToken)
{
List clientsDb=wait _context.Clients.Include(x=>x.Projects).Where(client=>!client.IsDeleted).toListSync();
Result clientsIdentity=wait _identityService.GetClients(clientsDb.Select(x=>x.IdentityId.ToList());
列表客户端=新列表();
foreach(clientsIdentity.Data中的var客户端)
{
客户端。添加(新客户端响应)
{
//两个属性正在从ClientSideEntity.Data填充
Email=client.Email,
Name=client.Name,
//clientsDb的第二个两个
Id=clientsDb.FirstOrDefault(x=>x.IdentityId.Equals(client.Id)).Id,
//一个客户有多个项目(列表)
//列表需要转换并打包到列表中(它是项目模型的dto对象)
Projects=clientsDb.Where(x=>x.IdentityId.Equals(client.Id))。选择(x=>newprojectresponse
{
//它不应该是第一个或默认的-现在它总是从第一个开始挑选,它应该是每个项目的某种形式。。
Id=x.Projects.FirstOrDefault().Id,
Code=x.Projects.FirstOrDefault().Code,
Name=x.Projects.FirstOrDefault().Name,
})托利斯先生()
});
}
返回客户;
}
所以我只映射了
FirstOrDefault
对象,但本质上我需要遍历客户机拥有的每个项目,并映射到一个新的ClientResponse项目,实际上是添加它们。我认为您的问题是,对于迭代中的每个客户机,您都检索到许多客户机。它应该只有一个id,所以像First、Single、FirstOrDefault等方法。。。应使用,然后您可以转换项目:
//...
Projects = clientsDb.Single(x => x.IdentityId.Equals(client.Id)).Projects.Select(x => new ProjectResponse...
或者,如果您在客户机
和项目
之间有导航属性,您可以这样使用它:
//...
Projects = client.Projects.Select(x => new ProjectResponse...
我认为您的问题在于,对于迭代中的每个客户机,您都检索到许多客户机。它应该只有一个id,所以像First、Single、FirstOrDefault等方法。。。应使用,然后您可以转换项目:
//...
Projects = clientsDb.Single(x => x.IdentityId.Equals(client.Id)).Projects.Select(x => new ProjectResponse...
或者,如果您在客户机
和项目
之间有导航属性,您可以这样使用它:
//...
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。当实际情况是,
返回一个集合时,您只希望一个客户端与该Id匹配
在不实际尝试代码的情况下,我认为如果您将其更改为以下内容(正如我在对您的问题的评论中提到的,Single
可能对您的业务逻辑更具表现力):
当然,假设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()
看起来好像你有一个放错地方了 通过查看代码和阅读您的文章,我的印象是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。当实际情况是,
返回一个集合时,您只希望一个客户端与该Id匹配
在不实际尝试代码的情况下,我认为如果您将其更改为以下内容(正如我在对您的问题的评论中提到的,Single
可能对您的业务逻辑更具表现力):
当然,假设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()
而不是clientsDb。其中try FirstOrDefault(实际上,SingleOrDefault可能更有效地表达业务逻辑)然后。从该对象中选择(x=>x.Projects)。而不是clientsDb。其中try FirstOrDefault(实际上,SingleOrDefault可能更有效地表达业务逻辑)然后。Select(x=>x.Projects)从那个物体里出来。