c# - 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;
我想我仍然可以对其进行更多优化,但是到目前为止,它可以按预期工作。
感谢您的多次提醒!
解决方案
看完评论后,我不得不承认我的做法是错误的。来自数据背景,我倾向于使用“逐步”模式。我重写了查询并且我工作:
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;
我想我仍然可以对其进行更多优化,但是到目前为止,它可以按预期工作。
感谢您的多次提醒!
推荐阅读
- javascript - 使用 Enyme/Jest 时如何模拟 axios.defaults
- sql - 我运行的查询返回同一列中的 2 个,这在 tableau 中是不允许的,我无法修复查询
- cplex - 如何解决铁路线路规划问题?
- python - 使用远程操作系统分隔符的路径连接
- wordpress-theming - 如何在 html5blank_nav() 的 ul 和 li 中添加类?
- sql - 带有破折号和下划线的 SQL Server 通配符语句 问题
- qt - 使用键盘快捷键切换可见性
- laravel - 以真实姓名下载数据库文件附件
- python - Python中具有复杂指数元素的矩阵
- json - 作为将 WCF 调用为 REST 服务的一部分,类型字典的属性之一没有被序列化