首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LINQ Union与SQL Union

LINQ Union与SQL Union
EN

Stack Overflow用户
提问于 2016-02-09 15:54:20
回答 3查看 1.9K关注 0票数 3

我在UsersUsersProjects之间有关系。UserProjects.UserIdUsers.UserId的引用

我想找到UserProjects中的用户,UserProjectUsreProjects.ProjectId == 4。然后将其他用户合并到这个表中。

事实上,我想改变一些用户的UserProject = 4的性能。

在MSSQL中,为了测试下面的查询

代码语言:javascript
复制
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

我不会改变任何财产。不管怎么说,结果它向我展示了它应该有的所有用户。

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

代码语言:javascript
复制
 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不允许复制时,它是如何进行的?

谢谢你!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-02-09 16:43:04

LINQ Union与SQL Union

它们是等价物。

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

它是,而不是同一个查询。在第一个(SQL)查询中,您只选择了一个字段(UserId),而在第二个字段(LINQ)中,您选择了两个字段,其中一个肯定是不同的。由于Union使用所有包含的字段作为该项是否唯一的标准,因此返回更多项的第二个查询是正常的。

既然如此,让我们看看如何解决这个具体的问题。看起来你根本不需要Union。通常,您应该有一个导航属性,因此像这样的简单查询应该完成任务(假设导航属性称为Projects):

代码语言:javascript
复制
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();
票数 2
EN

Stack Overflow用户

发布于 2016-02-09 16:06:19

SQL UNION (执行隐式DISTINCT)和LINQ Union (需要显式Distinct())之间的行为差异被解释为here

因此,对于特定情况,只需将Distinct()应用于查询即可。

票数 2
EN

Stack Overflow用户

发布于 2016-02-09 16:18:54

唯一性/无重复项基于完整的记录/ProjectUsersDTO实例。

项目4中的用户(或变量projectId的值)将在结果中为两次,一次为alreadyInProject = true,另一次为alreadyInProject = false。第一个选择只选择项目中的用户,第二个选择选择所有用户(包括项目中的用户)。它们被认为是不同的记录,因为alreadyInProject的值是不同的,因此两个版本都在输出中。

我不知道您想要什么,但我假设您需要一个所有用户的列表,并指明他们是否在带有给定projectId的项目中。你可以用这段代码

代码语言:javascript
复制
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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35296388

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档