首页 > 解决方案 > LINQ Join 和 GroupJoin 在同一个查询 CS1941

问题描述

我正在尝试将 3 个数据集加入到列表中。

人(自然人):

var persons = await _context.Persons.ToListAsync();

用户(用户帐户):

var users = await _context.Users.ToListAsync();

WORKCONTRACTS:我在这里使用 DTO 来减轻数据的负担。

var workcontractsList = await _context.Workcontracts
                        .Select(c => new WorkcontractDto()
                        {
                            Id = c.Id,
                            PersonId = c.PersonId,
                            WorkcontractType = c.WorkcontractType,
                            StartDate = c.StartDate,
                            EndDate = c.EndDate
                        })
                        .ToListAsync();

每个人可能有或没有匹配的用户。每个人可能有也可能没有一份或多份工作合同。结果应该是一个 PersonDto 列表,每个列表都包含一个人、她的用户名(来自用户)和一个工作合同列表。

 var query = await from p in persons
                    join u in users on p.Id equals u.PersonId
                    join w in workcontractsList on p.Id equals w.PersonId into wlist
                    select (p => new PersonDto()
                    {
                        PersonId = p.Id,
                        Person = p,
                        OrigamiUserName = u.UserName,
                        Workcontracts = wlist.ToList()
                    });
        return query;

我收到此错误:

CS1941:C# 连接子句中的表达式之一的类型不正确。对“加入”的调用中的类型推断失败。

我试图删除两个连接中的一个但没有成功。连接中使用的所有键都属于同一类型 (int),并在数据库级别强制执行。

请帮忙。

找到的解决方案:

看完评论后,我不得不承认我的做法是错误的。来自数据背景,我倾向于使用“逐步”模式。我重写了查询并且我工作:

        var query = await _context.Persons.Select(p => new PersonDto
        {
            PersonId = p.Id,
            Person = p,
            OrigamiUserName = p.OrigamiUser.UserName,
            Workcontracts = p.Workcontracts.Select(c => new WorkcontractDto 
                { 
                    Id = c.Id,
                    PersonId = c.PersonId,
                    WorkcontractType = c.WorkcontractType,
                    StartDate = c.StartDate,
                    EndDate = c.EndDate
                }).ToList()
        }).ToArrayAsync();
            
        return query;

我想我仍然可以对其进行更多优化,但是到目前为止,它可以按预期工作。

感谢您的多次提醒!

标签: c#linqentity-framework-core

解决方案


看完评论后,我不得不承认我的做法是错误的。来自数据背景,我倾向于使用“逐步”模式。我重写了查询并且我工作:

    var query = await _context.Persons.Select(p => new PersonDto
    {
        PersonId = p.Id,
        Person = p,
        OrigamiUserName = p.OrigamiUser.UserName,
        Workcontracts = p.Workcontracts.Select(c => new WorkcontractDto 
            { 
                Id = c.Id,
                PersonId = c.PersonId,
                WorkcontractType = c.WorkcontractType,
                StartDate = c.StartDate,
                EndDate = c.EndDate
            }).ToList()
    }).ToArrayAsync();
        
    return query;

我想我仍然可以对其进行更多优化,但是到目前为止,它可以按预期工作。

感谢您的多次提醒!


推荐阅读