LINQ Join和GroupJoin在同一查询CS1941中



我正在尝试将3个数据集连接到一个List中。

人员(自然人(:

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

USERS(用户帐户(:

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

工作合同:我在这里使用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#联接子句中某个表达式的类型不正确。对"Join"的调用中的类型推断失败。

我试图删除两个联接中的上个,但没有成功。联接中使用的所有键都属于同一类型(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;

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

感谢您的多次提醒!

最新更新