2012-01-17 12 views
0

私は投影を使用してViewModelsにデータを入力しています。Entity Framework - .Select()内の動的フィルタ

この場合、私はProjects and Tasksで作業しています。

私は、ユーザーがプロジェクトを選択し、プロジェクト内でタスクを割り当てることができる人をOPTIONALLYで選択できるフォームを持っています。

public IEnumerable<TaskVM> TaskVM { get; set; } 

私はそうのようなクエリをフィルタリングしています:

var query = db.Projects.AsQueryable(); 

if (filterProjectId) 
{ 
    query = query.Where(p => p.ProjectId == ProjectId); 
} 

if (filterAssignedTo) 
{ 
    query = query.Where(p => p.Tasks.Any(t => t.AssignedTo == "John")); 
} 

質問:以上持っているすべてのプロジェクトを返します私のプロジェクトのViewModelに

、私は仕事のために、このビューモデルを持っていますJohnに割り当てられたタスクはすべて削除されますが、Fredに割り当てられたタスクも戻されます。私の質問はこれです:どのように私はすべてのプロジェクトを得ることができますが、ジョンに割り当てられたタスクのみ?

私はこれを行うことができます知っている:

var resultList = query.Select(p => new ProjectVM 
{ 
    ProjectId = p.ProjectId, 
    ProjectName = p.ProjectName, 
    TaskVM = p.Tasks.Where(t => t.AssignedTo == "John").OrderByDescending(t => t.TaskName).Select(t => new TaskVM 
    { 
     TaskId = t.TaskId, 
     TaskName = t.TaskName, 
     AssignedTo = t.AssignedTo 
    }) 
}); 

しかし、私はジョンをフィルタリングする必要がある場合、私は知りません。ユーザーはprojectIdを持つすべてのプロジェクトを望むかもしれません。

もう一度、すべてのプロジェクトを取得するにはどうしたらよいですか?ただし、Johnに割り当てられたタスクはどうすればいいですか?

ありがとうございました!あなたはこのようなフィルタ「に割り当てられた」を定義でき

答えて

1

、あなたはのようなものを持っています動的フィルタリングはfilterProjectIdfilterAssignedToブール値に依存します。ここで

は、あなたが何ができるかです:

var resultList = db.Projects.Where(z => !filterProjectId || z.ProjectId == MyProjectId).Select(p => new ProjectVM 
{ 
    ProjectId = p.ProjectId, 
    ProjectName = p.ProjectName, 
    TaskVM = p.Tasks.Where(t => !filterAssignedTo || t.AssignedTo == "John").OrderByDescending(t => t.TaskName).Select(t => new TaskVM 
    { 
     TaskId = t.TaskId, 
     TaskName = t.TaskName, 
     AssignedTo = t.AssignedTo 
    }) 
}); 
1

Expression<Func<Project, bool>> assignedToFilter; 

if (filterAssignedTo) 
{ 
    assignedToFilter = p => p.Tasks.Any(t => t.AssignedTo == "John"); 
} 
else 
{ 
    assignedToFilter = p => true; 
} 

を...そして、このようにそれを使用する:私が理解から

var resultList = query.Where(assignedToFilter).Select(p => new ProjectVM 
{ 
    ProjectId = p.ProjectId, 
    ProjectName = p.ProjectName, 
    TaskVM = p.Tasks 
     .Where(assignedToFilter) 
     .OrderByDescending(t => t.TaskName) 
     .Select(t => new TaskVM 
     { 
      TaskId = t.TaskId, 
      TaskName = t.TaskName, 
      AssignedTo = t.AssignedTo 
     }) 
}); 
関連する問題