WCF 데이터 서비스를 사용하여 다음 LINQ 쿼리를보다 잘 디자인하는 방법에 대한 조언을 구합니다. 요구 사항은 ComboBox를 통해 Employees 목록을 표시하는 것입니다. 다음과 같이LINQ 문 최적화 - 더 나은 디자인을위한 조언을 구하십시오.
DB를 테이블 구조는 다음과 같습니다
직원은 많은 프로젝트에 할당 할 수 있고 프로젝트는 많은 직원을 가질 수있다. 이 관계는 3 테이블을 통해 설계되었습니다 : [Employees] 1--* [EmployeeProjects] *--1 [Projects]
. 도트 국가에서는 객체 트리를 가로 지르는 경우와 비슷할 것입니다 : Employee.EmployeeProjects.Project
.
다음 LINQ 문은 EmployeeProjects
의 목록을 반환하지만 내가 선택한 것은 특정 프로젝트의 일부인 Employee 목록입니다. 이상적으로는 IQueryable<Employee>
을 실행하는 것이 맞지만 EmployeeProjects
링크 (다수)로 인해 LINQ 문을 구성하는 방법을 모르겠습니다. 내 딜레마가 보이니?
아래 LINQ 문에서 볼 수 있듯이 직원 및 프로젝트 측면이 모두 1 개의 관계이므로 "많은"측면을 다루지 않기 때문에 IQueryable<EmployeeProject>
을 수행합니다. 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;
}
더 나은 디자인에 대한 조언을 주시면 감사하겠습니다.
필자는 논리가 의도적으로 거꾸로되어있어 제약 조건 목록을 사용하고 필드를 비교 (또는 포함)한다는 점을 강조해야한다고 생각합니다. 일반적인 방법 (field.Contains (constraint_array))을 수행 할 수는 있지만 뒤로 방향을 사용하면보다 간결한 SQL 쿼리를 생성 할 수 있습니다. – Tory
오타이기 때문에 Compares -> Contains를 수정했습니다. 그러나 나는 당신이 다른 방향으로 무엇을 의미하는지 확신 할 수 없다. 'str.Contains (arrayOfStr)'는 유효한 구문이 아닙니다. – Corylulu
예, 죄송합니다. 그게 내가 직접 시도하는 것보다 뭔가를 확인하는 것입니다. 나는 잘못 읽었고 다른 방법으로도 허용 할 수는 있지만 (실제로 읽은 것은 다른 LINQ를 다른 SQL 쿼리로 호출하는 것입니다) 제가 말한 다른 모든 것은 여전히 유효합니다. – Tory