2009-08-20 30 views
8

Có cách nào trong LINQ để làm một OrderBy và sau đó làm một ThenBy với ThenBy bằng cách sử dụng con của đối tượng cha mẹ để làm thứ tự thứ cấp?LINQ OrderBy Name ThenBy ChildrenCollection.Name

_repository.GetActiveDepartmentGroupsWithDepartments().OrderBy(c => c.DepartmentGroupName).ThenBy(c => c.Departments.OrderBy(d => d.DepartmentName)) 

Trong trường hợp trên, c.Departments là EntityCollection.

BTW: Khi tôi cố gắng nêu trên và sau đó làm một ToList() trên đó, tôi nhận được lỗi này:

DbSortClause expressions must have a type that is order comparable. 
Parameter name: key 

Cảm ơn trước sự giúp đỡ nào hoặc hướng dẫn.

Trả lời

17

Có vẻ như bạn đang cố gắng lấy danh sách tất cả các phòng ban được sắp xếp theo nhóm rồi tên phòng ban. Nếu vậy, thì có thể bạn muốn làm một cái gì đó như thế này:

var res = from c in _repository.GetActiveDepartmentGroupsWithDepartments() 
      from d in c.Departments 
      orderby c.DepartmentGroupName, d.DepartmentName 
      select d; 

Hoặc trong phương pháp cú pháp:

var res = _repository.GetActiveDepartmentGroupsWithDepartments() 
        .SelectMany(c => c.Departments, (c,d) => new { c, d }) 
        .OrderBy(x => x.c.DepartmentGroupName) 
        .ThenBy(x => x.d.DepartmentName) 
        .Select(x => x.d); 
2

Kể từ Deparment là một bộ sưu tập, bạn phải chuyển đổi nó vào một vô hướng sử dụng nó cho sắp xếp.

Một tùy chọn là chọn một thực thể duy nhất trong bộ sưu tập, ví dụ: tên của bộ phận đầu tiên:

_repository.GetActiveDepartmentGroupsWithDepartments() 
    .OrderBy(c => c.DepartmentGroupName) 
    .ThenBy(c => c.Departments 
     .OrderBy(d => d.DepartmentName) 
     .FirstOrDefault() 
     .DepartmentName 
    ) 

Một tùy chọn khác là đặt hàng bởi một thuộc tính của bộ sưu tập, ví dụ: số lượng phòng ban:

_repository.GetActiveDepartmentGroupsWithDepartments() 
    .OrderBy(c => c.DepartmentGroupName) 
    .ThenBy(c => c.Departments.Count()) 
Các vấn đề liên quan