Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何借助linq lambda select映射到另一个对象列表_C#_Linq_Asp.net Core - Fatal编程技术网

C# 如何借助linq lambda select映射到另一个对象列表

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

我在某个点上停了下来,我不知道如何将项目列表映射到ProjectResponse对象列表。 ProjectResponse是Project model类的一个缩短版本,从技术上讲,它是DTO对象

事情是这样的

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)从那个物体里出来。