2016-12-25 10 views
1

各部門で最も多くのレポートを持つ従業員を選択しようとしています。私はEntity FrameworkのLINQでこれを行う方法を理解できません。私はEF Coreを使用していますが、答えはEF 6と同じでなければならないので、いずれかの答えがうまくいきます。 .Distinct()を使用する必要があることは分かっていますが、正しく使用する方法がわかりません。Entity Frameworkの各親プロパティの上位結果を取得

ほとんどのレポートを持つ各部門の従業員を取得するにはどうすればよいですか?クエリは、従業員のリスト(またはクエリ可能)を返す必要があります。

public class Employee 
{ 
    public long Id { get; set; } 
    public string Name { get; set; } 

    public long DepartmentId { get; set; } 
    public Department Department { get; set; } 

    public ICollection<Report> Reports { get; set; } 
} 

public class Department 
{ 
    public long Id { get; set; } 
    public string Name { get; set; } 

    public ICollection<Employee> Employees { get; set; } 
} 

これは私が始まったことですが、これが正しい方法であるかどうかはわかりません。

var employees = _context.Employees 
    .OrderByDescending(e => e.Reports.Count) 
    // ? 

答えて

1

ただ、ほとんどのレポートで、各部門から従業員を取る:

var employees = _context.Departments.Select(department => 
        department.Employees.OrderByDescending(employee => employee.Reports.Count).FirstOrDefault()).ToList(); 
+0

完璧です。それが最初に来てから私はあなたの答えを受け入れるでしょう。ありがとうございました! – vaindil

0

はこれを試してみてください:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var results = Department.departments.Select(x => new { 
       deptmentName = x.Name, 
       maxEmployeeReports = x.Employees.Select(y => new { name = y.Name, count = y.Reports.Count, employee = y }).OrderByDescending(z => z.count).FirstOrDefault() 
      }).ToList(); 
     } 
    } 
    public class Employee 
    { 
     public long Id { get; set; } 
     public string Name { get; set; } 

     public long DepartmentId { get; set; } 
     public Department Department { get; set; } 

     public ICollection<Report> Reports { get; set; } 
    } 

    public class Department 
    { 
     public long Id { get; set; } 
     public string Name { get; set; } 

     public ICollection<Employee> Employees { get; set; } 
     public static List<Department> departments = new List<Department>(); 
    } 
    public class Report 
    { 
    } 
} 
1

あなたは、部門レベルでのクエリを開始する必要があります。各部門内で、最高の報告件数を持つ従業員を取得します。

var topEmpPerDep = _context.Departments 
    .Select(dep => new 
    { 
     Department = dep.Name, 
     Employee = dep.Employees.OrderByDescending(e => e.Reports.Count) 
      .FirstOrDefault().Name 
    }); 
関連する問題