Hãy xem xét các đối tượng sau đây đơn giản và các mối quan hệ:Cách nhóm nhiều mục bằng GroupBy()?
public class Job{
int JobId;
String name;
String status;
Discipline disc;
WorkCategory workCat;
}
public class Discipline {
int DisciplineId;
String DisciplineName;
}
public class Workcategory{
int WorkCategoryId;
String WorkCategoryName;
}
public Class Grouping{
Discipline parent;
List<Workcategory> children;
}
Các mô hình trên một mối quan hệ mà một Job
được liên kết với một Discipline
và một WorkCategory
. Workcategory
luôn là con của một phụ huynh cụ thể Discipline
(mối quan hệ một-nhiều). Chúng ta có thể giả định rằng mối quan hệ của Kỷ luật được giao và Danh mục công việc sẽ luôn hợp lệ.
Vấn đề tôi đang đối mặt là khi tôi đang cố gắng tạo đối tượng kết quả Grouping
dựa trên các bộ lọc được áp dụng cho Jobs
. Tôi không chắc chắn Nếu điều này có thể được thực hiện hoặc nếu cách tiếp cận tôi đang dùng thậm chí là chính xác. Câu hỏi chính xác chính nó là không rõ ràng với tôi, tuy nhiên ở trên xác định các vấn đề tuyên bố.
- Thiết kế có thể được cải thiện không?
- Tôi làm cách nào để có thể nhóm Công việc theo Kỷ luật và Danh mục công việc?
- Tôi thậm chí có cần lớp học
Grouping
không?
Tôi đã thử những điều sau (đây là lần đầu tiên tôi sử dụng LINQ), nhưng không thành công vì sự hiểu biết của tôi chưa đủ. Cách khác là trước tiên hãy lấy nhóm Discipline
và lặp qua nhóm ban đầu để chọn số Workcategory
có liên quan.
var grouping = repository.GetJobsWithActiveStatus()
.GroupBy(x => new {
x.Discipline.DisciplineID,
x.Discipline.DisciplineName,
x.Category.WorkCategoryID,
x.Category.WorkCategoryName
})
.Select(g => new Grouping{
Discipline = new Discipline{
DisciplineID = g.Key.DisciplineID,
Name = g.Key.DisciplineName
},
Categories = ?? // this is where I am lost
}});
Edit: Sau khi đăng tải này, tôi nhận ra rằng các thông số groupby inital kết quả trong một nhóm mặt hàng trong khi tôi đang tìm kiếm kết quả Nhóm-nhóm.
Chỉnh sửa 2: Để làm rõ một chút nữa, tôi không muốn những công việc liên quan như là một phần của kết quả, nhưng nhóm chứ không phải Kỷ Luật-Workcategory - vì vậy lý do cho lớp Grouping
Initial giải pháp dựa trên @Obalix
Sửa 7-Mar-2010:
Giải pháp này không hoạt động - GroupBy trên đối tượng Kỷ luật sẽ mang lại một nhóm duy nhất cho mỗi đối tượng. Tôi nghĩ điều này là do nó là một kiểu tham chiếu. Tôi có đúng không? Tôi bước đầu chấp nhận điều này như là câu trả lời, tuy nhiên sau khi một số đầu gãi nhận ra rằng bản thân dữ liệu giả của tôi đã bị lỗi. Các câu hỏi ban đầu vẫn được trả lời.
var result = repository.GetJobsWithActiveStatus()
.GroupBy(x => x.disc)
.Select(g => new Grouping
{
Discipline = g.Key,
Catergories = g.GroupBy(x=>x.workCat) // <--- The Problem is here, grouping on a reference type
.Select(l=>l.Key) // needed to select the Key's only
.ToList()
});
Tôi đã xem xét liên kết và đọc nhận xét đã dẫn tôi đến bài đăng khác, vì vậy sẽ xem xét thêm. Tuy nhiên, tôi đang tìm kiếm một kết quả được đánh máy mạnh mẽ (Grouping) – Ahmad
Sau đó, bạn chỉ cần thay thế 'new {}' bằng 'new StrongType {}'. Và istedad của jusing 'Key',' Count', và 'WorkCategoryGroups' sử dụng các thành viên tùy chỉnh của bạn. Cách tiếp cận mở rộng được mô tả bởi liên kết được đánh máy mạnh mẽ. – AxelEckenberger
FYI - đăng trong câu trả lời ở trên là rất tốt - có một bài viết tiếp theo về Dynamic GroupByMany cũng như nếu có ai quan tâm http://blogs.msdn.com/mitsu/archive/2008/02/07/linq -groupbymany-dynamically.aspx – Ahmad