次の LINQ クエリを (WCF Data Services を使用して) より適切に設計する方法についてアドバイスを求めています。要件は、ComboBox を介して従業員のリストを表示することです。
DB テーブルの構造は次のとおりです。
従業員は多くのプロジェクトに割り当てることができ、プロジェクトは多くの従業員を持つことができます。この関係は、次の 3 つのテーブルを介して設計されています[Employees] 1--* [EmployeeProjects] *--1 [Projects]
。ドット ネーションでは、オブジェクト ツリーをトラバースすると、次のようになりますEmployee.EmployeeProjects.Project
。
次の LINQ ステートメントは のリストを返しますEmployeeProjects
が、私が求めているのは、これらの特定のプロジェクトの一部である Employee のリストです。理想的には、 を実行するのは理にかなっていますが、リンク (多数)IQueryable<Employee>
のために LINQ ステートメントを構造化する方法がわかりません。EmployeeProjects
私のジレンマがわかりますか?
IQueryable<EmployeeProject>
以下の LINQ ステートメントからわかるように、従業員側とプロジェクト側はどちらも 1 つの関係であるため、「多」の側面に対処する必要がないため、実行します。のリストを取得した後EmployeeProjects
、それに対して別の.Select()
ステートメントを実行して、最終的に求めているもの、つまり一意の従業員名のリストを返し.Select(results => results.Employee.Name).Distinct()
ます。
private IQueryable<EmployeeProject> GetEmployeeProjects()
{
var employeeProjects = service
.CustomQuery<EmployeeProject>()
.Where(et => ep.Project.Name == "TrackerX 43" ||
ep.Project.Name == "AccountingX 11" ||
ep.Project.Name == "TopX 2" ||
ep.Project.Name == "SiteX 32" ||
ep.Project.Name == "BuildingX 3" ||
ep.Project.Name == "ReportX 321" ||
ep.Project.Name == "PrototypeX 78" ||
ep.Project.Name == ... more ...)
.OrderBy(ep => ep.Employee.Name)
.Select(ep => new EmployeeProject
{
Id = ep.Id
Project = new Project
{
Name = ep.Project.Name
},
Employee = new Employee
{
Id = ep.Employee.Id,
Name = ep.Employeet.Name
}
});
return employeeProjects;
}
これをより良く設計するためのアドバイスをいただければ幸いです。