如何在 LINQ 中使用表达式执行此查询?

How to do this query using expression in LINQ?

select t.*
from Task t
inner join Project p on a.ProjectId = t.ProjectId
where p.ProjectTypeId IN    (   select ptg.ProjectTypeId
                                from UserGroup ug 
                                inner join ProjectTypeGroup ptg on ug.GroupId = ptg.GroupId
                                where ug.UserId = 1 -- MUTABLE VALUE
                            )

在您给出的尝试查询中,我没有看到正在使用的任务。

因为你的子查询和你的主查询没有关系,你应该把它们分成两个查询:

var projTypeIds = (from ug in UserGroup 
                   join ptg in ProjectTypGroup on ug.GroupId equals ptg.GroupId
                   where ug.UserId == 1
                   select ptg.ProjectTypeId).ToList()

获得输出后,检查 .Contains

var task = (from t in Task
            join p in Project on p.ProjectId equals t.ProjectId
            where projTypeIds.Contains(p.ProjectTypeId)
            select t).FirstOrDefault();

我假设您只需要此查询中的一个对象,因此使用 .FirstOrDefault(),如果您希望使用 .ToList()

的列表

你可以用这个。

from t in Task
join p in Project
    on t.ProjectId equals p.ProjectId
let subQ = ( from ug in UserGroup
             join ptg in ProjectTypeGroup
                on ug.GroupId equals ptg.GroupId
             where ug.UserId == 1
             select ptg.ProjectTypeId)
where subQ.Contains(p.ProjectTypeId)  
select t

或者你可以使用这个。

 int loggedUserId = 1;

 var _userGroups = 
    UserGroup.Join(ProjectTypeGroup, 
            t => t.GroupId, p => p.GroupId, 
            (t, p) => new {t, p}) 
        .Where(n => n.t.UserId == loggedUserId)
        .Select(s => s.p.ProjectTypeId);

 var projectTypeIds = 
    Task.Join(Project, 
            t => t.ProjectId, p => p.ProjectId, 
            (t, p) => new {t, p}) 
        .Where(n => _userGroups.Contains(n.p.ProjectTypeId) )
        .Select(n => n.t); 

 projectTypeIds.ToList();