2016-02-12 49 views
0

我有两个关系:UsersUserProjects左连接和与列在LINQ区分

我想检查哪个用户已经在项目中。到目前为止,它是这样的:

var usrs = (from users in context.Users 
         join userProj in context.UserProjects 
         on users.UserId equals userProj.UserId into gj 
         from subuserProject in gj.DefaultIfEmpty() 
         select new ProjectUsersDTO 
         { 
          UserName = users.Name, 
          Rate = users.RatePerHour, 
          UserId = users.UserId, 
          alreadyInProject = subuserProject == null || subuserProject.ProjectId != projectId ? false : true 
         }) 
         .ToList(); 

问题是我想让他们不同。现在我得到一个用户alreadyInProject == truealreadyInProject == false

+2

这是完全一样的你的[上一个问题](http://stackoverflow.com/questions/35296388/linq-union-vs-sql-union),我已经给你[答](http:// stackoverflow .COM /问题/ 35296388/LINQ工会-VS-SQL工会/ 35297463#35297463) –

回答

0

如果你正在检查一些特定的项目,那么你就不需要参加所有项目 - 加盟之前,只过滤用户项目:

from user in context.Users 
join userProj in context.UserProjects.Where(up => up.ProjectId == projectId) 
    on user.UserId equals userProj.UserId into g 
from subuserProject in g.DefaultIfEmpty() 
select new ProjectUsersDTO { 
    UserName = user.Name, 
    Rate = user.RatePerHour, 
    UserId = user.UserId, 
    alreadyInProject = (subuserProject != null) 
} 

生成的查询将看起来像

SELECT 
    [Extent1].[UserId] AS [UserId], 
    [Extent1].[Name] AS [Name], 
    [Extent1].[RatePerHour] AS [RatePerHour], 
    CASE WHEN ([Extent2].[UserProjectId] IS NOT NULL) 
     THEN cast(1 as bit) 
     ELSE cast(0 as bit) 
    END AS [C1] 
    FROM [dbo].[Users] AS [Extent1] 
    LEFT OUTER JOIN [dbo].[UserProjects] AS [Extent2] 
    ON ([Extent2].[ProjectId] = @p__linq__0) AND ([Extent1].[UserId] = [Extent2].[UserId])