2012-07-21 3 views
1

MVC3을 사용하면서도 LINQ를 배우고 있습니다. LINQ 쿼리를 엔터티로 변환하는 데 문제가 있습니다. 직원 개체를 반환하고 싶습니다.Ninject를 사용하여 MVC3에서 SQL을 LINQ로 변환

SELECT E.EmployeeID, E.FirstName, E.LastName, MAX(EO.EmployeeOperationDate) AS "Last Operation" 
FROM Employees E 
INNER JOIN EmployeeStatus ES ON E.EmployeeID = ES.EmployeeID 
INNER JOIN EmployeeOperations EO ON ES.EmployeeStatusID = EO.EmployeeStatusID 
INNER JOIN Teams T ON T.TeamID = ES.TeamID 
WHERE T.TeamName = 'MyTeam' 
GROUP BY E.EmployeeID, E.FirstName, E.LastName 
ORDER BY E.FirstName, E.LastName 

몇 가지 테이블이 있지만 EmployeeOpertionDate를 기반으로 최신 상태 만 가져와야합니다. 이 SQL에서 잘 작동하는 것으로 보인다. 또한 Ninject를 사용하여 Ienumerable을 반환하도록 내 쿼리를 설정합니다. 그룹별로 옵션을 가지고 놀았지만 IGroupable을 반환합니다. 속성 객체 유형을 변환하고 반환하는 지침은 만족 스러울 것입니다.

편집 : LINQ에서이 글을 쓰기 시작했으나 올바른 형식을 올바르게 반환하거나 캐스트하는 방법을 모르겠습니다.

public IQueryable<Employee> GetEmployeesByTeam(int teamID) 
    { 

     var q = from E in context.Employees 
       join ES in context.EmployeeStatuses on E.EmployeeID equals ES.EmployeeID 
       join EO in context.EmployeeOperations on ES.EmployeeStatusID equals EO.EmployeeStatusID 
       join T in context.Teams on ES.TeamID equals T.TeamID 
       where T.TeamName == "MyTeam" 
       group E by E.EmployeeID into G 
       select G; 
     return q; 
    } 

Edit2가 :

이가 작동하는 것 같다

나 나는 당신의 SQL 쿼리가 작동하도록되어 방법에 정확하게 명확하지,하지만 난이 모양을 시도했습니다

public IQueryable<Employee> GetEmployeesByTeam(int teamID) 
    { 

     var q = from E in context.Employees 
       join ES in context.EmployeeStatuses on E.EmployeeID equals ES.EmployeeID 
       join EO in context.EmployeeOperations.OrderByDescending(eo => eo.EmployeeOperationDate) on ES.EmployeeStatusID equals EO.EmployeeStatusID 
       join T in context.Teams on ES.TeamID equals T.TeamID 
       where T.TeamID == teamID 
       group E by E.EmployeeID into G 
       select G.FirstOrDefault(); 
     return q; 
    } 
+0

이 사용하려고했던'Linqer' http://www.sqltolinq.com/, 너무 ... – Yasser

+0

귀하의 SQL 쿼리가 LINQ가있는 동안 왼쪽 외부 조인을 사용하는 많은 사람들이있다 내부 조인을 사용하면 다른 테이블에 일치하는 행이 없더라도 SQL이 행을 반환합니다. LINQ는 모든 테이블에 일치하는 데이터가있는 경우에만 행을 반환합니다. 당신이하고있는 일을 그냥 보면서, 당신은 내적 조인을해야한다고 생각합니다 ??? –

+0

맞습니다. 내부 조인을 사용해야합니다. 지금 당장은 적절한 구문에 대해 더 염려합니다. 위의 예를 수정합니다. – Jeff

답변

0

당신의 LINQ 쿼리는 수행중인 작업을 일치시키고 형식도 Employee을 반환합니다. 이것은 당신이 필요로하는 정확한 솔루션을 받고으로 당신을 설정해야합니다

var q = from E in context.Employees 
     join ES in context.EmployeeStatuses on E.EmployeeID equals ES.EmployeeID 
     join EO in context.EmployeeOperations 
      .OrderByDescending (x => x.EmployeeOperationDate) 
       on ES.EmployeeStatusID equals EO.EmployeeStatusID 
     join T in context.Teams on ES.TeamID equals T.TeamID 
     where T.TeamName == "MyTeam" 
     group new { E.EmployeeID, E.FirstName, E.LastName, EO.EmployeeOperationDate } 
      by new {E.EmployeeID, E.FirstName, E.LastName } into G 
     orderby G.Key.LastName,G.Key.FirstName 
     select new Employee 
     { 
      EmployeeID = G.Key.EmployeeID, 
      FirstName = G.Key.FirstName, 
      LastName = G.Key.LastName, 
      LastOperation = G.First().EmployeeOperationDate 
     }; 
+0

Brad. 나는 또한 내가 찾던 결과를 줄 것 같은 것보다 위에 업데이트했다. 나는 그것으로 몇 가지 테스트를 할 필요가있다. 위의 샘플을 고맙게 생각합니다. 좀 더 자세하게 살펴 보겠습니다. – Jeff

+0

쿼리가 제대로 실행되지만 그룹화가 제대로 수행되지 않습니다. 직원은 많은 EmployeeStatus가 하나의 EmployeeOperation을가집니다. 내가 잡으려고하는 것은 마지막 작업 (날짜)에 기반한 팀입니다. 종업원이 3 가지 상태를 변경하면 위의 세 가지 모두가 반환됩니다. – Jeff

+0

@ 제프, 제 코드를 수정했습니다. –

1

제프, 당신의 "Edit2가가"도움이뿐만 아니라 나를 위해 일한! 나는 이런 식으로했다 :

public IEnumerable<ListCases> GetListCases(int? customerId, int? languageId, int? userGroupId) 
{  
    var query = from cfs in this.DataContext.CaseFieldSettings 
      join cfsl in this.DataContext.CaseFieldSettingLanguages on cfs.Id equals cfsl.CaseFieldSettings_Id 
      join cs in this.DataContext.CaseSettings on cfs.Name equals cs.Name 
      where cfsl.Language_Id == languageId && cfs.ShowOnStartPage == 1 && cfs.Customer_Id == customerId && cs.UserGroup == userGroupId && cs.Name != null 
      group cfs by new { 
            cfs.Id, cfs.Customer_Id, cfsl.CaseFieldSettings_Id, cfsl.Label, cfsl.Language_Id, cfs.ShowOnStartPage, cs.Name 
           } into grouped 

      select new ListCases 
      { 
       Id = grouped.Key.Id, CFS_Id = grouped.Key.CaseFieldSettings_Id, Label = grouped.Key.Label, Language_Id = grouped.Key.Language_Id, Customer_Id = grouped.Key.Customer_Id, Show = grouped.Key.ShowOnStartPage, CSName = grouped.Key.Name 
      }; 

    return query; 
}