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 で関連付けてフィルターする方法がわかりません。

4

2 に答える 2

9
 context.Projects.Where( 
            p => p.Tasks.Any( 
                        t => t.TaskAssigns.Any( ta => ta.UserId == userId ) 
                        ) 
                      )
于 2012-08-13T15:44:18.167 に答える
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;
于 2012-08-13T15:43:49.777 に答える