1

私は MVC3 を使用していますが、まだ LINQ を学習しています。クエリを LINQ to Entities に変換しようとすると、問題が発生します。従業員オブジェクトを返したい。

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;
    }

編集2:

これは私のために働くようです

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;
    }
4

2 に答える 2

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;
}
于 2012-10-24T10:58:46.970 に答える
0

あなたの SQL クエリがどのように機能するかは正確にはわかりませんが、LINQ クエリを実行内容に合わせて整形しようとしましたが、 type も返されます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
         };
于 2012-07-22T17:25:32.410 に答える