我在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不允许复制时,它是如何进行的?
谢谢你!
发布于 2016-02-09 16:43:04
LINQ Union与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();发布于 2016-02-09 16:06:19
SQL UNION (执行隐式DISTINCT)和LINQ Union (需要显式Distinct())之间的行为差异被解释为here。
因此,对于特定情况,只需将Distinct()应用于查询即可。
发布于 2016-02-09 16:18:54
唯一性/无重复项基于完整的记录/ProjectUsersDTO实例。
项目4中的用户(或变量projectId的值)将在结果中为两次,一次为alreadyInProject = 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;https://stackoverflow.com/questions/35296388
复制相似问题