我在尋求如何更好地設計以下LINQ查詢(使用WCF數據服務)的建議。要求是通過ComboBox顯示員工列表。LINQ聲明優化 - 尋求更好設計的建議
數據庫表結構如下:
僱員可以被分配給許多項目和項目可以有很多員工。這種關係通過3個表格設計:[Employees] 1--* [EmployeeProjects] *--1 [Projects]
。在dot國家,這就好像我正在遍歷對象樹:Employee.EmployeeProjects.Project
。
以下LINQ語句返回一個EmployeeProjects
的列表,但是我之後是作爲這些特定項目的一部分的Employee列表。理想情況下,執行IQueryable<Employee>
是有意義的,但是我不知道如何構建我的LINQ語句,因爲鏈接(很多)是EmployeeProjects
。你看到我的困境嗎?
我執行IQueryable<EmployeeProject>
,因爲從以下的LINQ語句中可以看出,我從來不必處理「Many」方面,因爲Employee和Project方都是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;
}
任何關於設計這個更好的建議將不勝感激。
我認爲你應該強調邏輯是有意向後的,以便你使用約束列表和.Compares(或.Contains)這個字段。雖然你可以按照正常的方式(field.Contains(constraint_array))來執行,但是後向方法會產生更簡潔的SQL查詢。 – Tory 2013-03-09 00:20:30
我修正了比較 - >包含的東西,因爲這是一個錯字。但我不確定你的意思。 'str.Contains(arrayOfStr)'不是有效的語法。 – Corylulu 2013-03-09 00:30:08
對,對不起。這就是我只需要檢查某些東西而不是自己嘗試的方法。我誤解了一些東西,儘管它允許另一種方式(我真正閱讀的內容是在另一箇中調用一個LINQ to SQL查詢)。我所說的其他一切仍然存在。 – Tory 2013-03-09 00:37:49