LINQ 联合与 SQL 联合

2024-01-04

我之间有关系Users and UsersProjects. UserProjects.UserId参考Users.UserId

我想找到位于的用户UserProjects and UserProject has UsreProjects.ProjectId == 4。然后将其余的用户合并到该表中。

事实上我想改变 User 的一些属性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 联合与 SQL 联合

它们是等价的。

但现在使用相同的查询并更改属性会导致比我更多的用户。

It's 不一样询问。在第一个 (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();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LINQ 联合与 SQL 联合 的相关文章

随机推荐