2012-08-13 148 views
0

我有这些类:实体框架过滤器子集合

public class Project 
{ 
    public int ProjectId { get; set; } 
    public int AccountId { get; set; } 
    public int UserId { get; set; } 
    public string Name { get; set; } 
    public DateTime StartDate { get; set; } 
    public string Description { get; set; } 
    public string Tags { get; set; } 
    public virtual List<Task> Tasks { get; set; } 
} 

public class Task 
    { 
     public int TaskId { get; set; } 
     public int ProjectId { get; set; } 
     public string Name { get; set; } 
     public string Description { get; set; } 
     public DateTime StartDate { get; set; } 
     public DateTime? DueDate { get; set; } 
     public int TaskOwnerId { get; set; } 
     public string Tags { get; set; } 
     public virtual Project Project { get; set; } 
     public virtual List<TaskAssigned> TaskAssigns { get; set; } 
     public virtual List<TaskComment> TaskComments { get; set; } 
    } 

public class TaskAssigned 
    { 
     public int TaskAssignedId { get; set; } 
     public int TaskId { get; set; } 
     public int UserId { get; set; } 
    } 

,我需要把所有的项目都属于基于分配给他/她 我想出了这个解决方案,但我能任务的每个用户不能前进:

public List<Project> GetProjectsByAccountIdUserId(int accountId, int userId) 
     { 
      var tasks = context.TaskAssigns.Where(ta => ta.UserId == userId).ToList(); 
      var projects =context.Projects.Where(p => p.AccountId == accountId).Include("Tasks").ToList(); 
      return projects; 
     } 

我不知道如何通过taskId关联和过滤每个项目的任务。

回答

9
context.Projects.Where( 
      p => p.Tasks.Any( 
         t => t.TaskAssigns.Any(ta => ta.UserId == userId) 
         ) 
        ) 
0

当你正在做这种类型的任务时,你想将数据关联到谁拥有什么。

所以一个项目有任务。用户具有分配给他们的任务。用户在一个项目上。

因此,对于给定用户,我希望他们的项目。对? (你现在点头)但是最初我只知道用户的角度,任务知道用户所在的项目。

var projectIdentities = (from t in context.Tasks 
       join a in context.TaskAssigned on t.TaskId equals a.TaskId 
       where a.UserId == userId 
       select t.ProjectId).Distinct(); 
    List<Project> userProjects = (from p in context.Projects 
        where projectIdentities.Contains(p.ProjectId) 
        select p).ToList(); 
    return userProjects;