我在寻求如何更好地设计以下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