我在Users
和UsersProjects
之间有关系。 UserProjects.UserId
对Users.UserId
的引用
我想找到UserProjects
的用户,UserProject
有UsreProjects.ProjectId == 4
。然后将其余用户合并到此表中。
事实上,我想更改一些UserProject = 4
的用户属性。
在MSSQL中,只是为了测试我有以下查询
Select U.UserId
from Users U
Join UserProjects UP
On U.UserId = up.UserId
Where up.ProjectId = 4
Union
Select U.UserId From Users U
我没有更改任何属性。无论如何,结果它向我展示了整个用户。
但是现在使用相同的查询来更改属性会导致比我更多的用户。
var usrs = ((from users in context.Users
join userProj in context.UserProjects
on users.UserId equals userProj.UserId
where userProj.ProjectId == projectId
select new ProjectUsersDTO
{
UserName = users.Name,
Rate = users.RatePerHour,
UserId = users.UserId,
alreadyInProject = true
})
.Union(from users in context.Users
select new ProjectUsersDTO
{
UserName = users.Name,
Rate = users.RatePerHour,
UserId = users.UserId,
alreadyInProject = false
}))
.ToList();
return usrs;
当 UNION 不允许重复时,情况如何?
谢谢你!
LINQ Union vs SQL Union
它们是等效的。
但是现在使用相同的查询来更改属性会导致比我更多的用户。
这不是同一个查询。在第一个 (SQL) 查询中,您只选择(包括)一个字段 ( UserId
),而在第二个 (LINQ) 中,您包括几个字段,其中一个肯定是不同的。由于Union
使用所有包含的字段作为项目是否唯一的条件,因此第二个查询返回更多项目是正常的。
话虽如此,让我们看看如何解决具体问题。看起来你根本不需要Union
。通常你应该有一个导航属性,所以像这样的简单查询应该可以完成这项工作(假设导航属性被称为Projects
):
var query =
from user in context.Users
select new ProjectUsersDTO
{
UserName = user.Name,
Rate = user.RatePerHour,
UserId = user.UserId,
alreadyInProject = user.Projects.Any(userProj => userProj.ProjectId == projectId)
};
var result = query.ToList();
这里解释了SQL UNION
(执行隐式DISTINCT
)和LINQ Union
(需要显式Distinct()
)之间的行为差异。
因此,对于您的特定情况,只需对查询应用Distinct()
。
唯一性/无重复项基于完整的记录/ProjectUsersDTO 实例。
项目 4 中的用户(或任何变量 projectId 的值)将在结果中出现两次,一次是 已经InProject = true,另一次是 alreadyInProject = false。第一个选择仅选择项目中的用户,第二个选择选择所有用户(包括项目中的用户)。它们被视为不同的记录,因为 alreadyInProject 的值不同,因此两个版本都将在输出中。
我不确定你想要什么,但我假设你想要一个所有用户的列表,并指示他们是否在具有给定 projectId 的项目中。您可以使用此代码
var usrs = (from users in context.Users
join userProj in context.UserProjects
on users.UserId equals userProj.UserId
select new ProjectUsersDTO
{
UserName = users.Name,
Rate = users.RatePerHour,
UserId = users.UserId,
alreadyInProject = (userProj.ProjectId == projectId)
})
.ToList();
return usrs;