Về cơ bản những gì tôi đang cố gắng làm là nhận được phụ huynh nhóm lại theo Parent.type nơi Child.type họ có tư cách 'y' lệnh của child.DateLINQ nhóm theo lệnh tài sản cha mẹ của đứa trẻ
Như một ví dụ i đã tạo các lớp này:
public class Collection
{
public IEnumerable<Parent> Parents { get; set; }
public int Id { get; set; }
}
public class Parent
{
public int Id { get; set; }
public Type type { get; set; }
public IEnumerable<Child> Children { get; set; }
}
public class Child
{
public int Id { get; set; }
public Status Status { get; set; }
public DateTime Date { get; set; }
}
public enum Type
{
a,
b
}
public enum Status
{
x,
y
}
Điều tôi muốn là danh sách Cha mẹ của từng loại mà Ngày của trẻ có giá trị cao nhất.
Để có được ví dụ này đi tôi đã thêm một số dữ liệu thử nghiệm:
Collection collection= new Collection
{
Id = 1,
Parents = new List<Parent>
{
new Parent
{
Id= 1,
type = Type.a,
Children = new List<Child>
{
new Child
{
Id = 1,
Status = Status.y,
Date = DateTime.Now.AddDays(-1)
},
new Child
{
Id = 2,
Status = Status.x,
Date = DateTime.Now.AddDays(-1)
}
}
},
new Parent
{
Id= 2,
type = Type.b,
Children = new List<Child>
{
new Child
{
Id = 3,
Status = Status.y,
Date = DateTime.Now.AddDays(-2)
},
new Child
{
Id = 4,
Status = Status.x,
Date = DateTime.Now.AddDays(-2)
}
}
},
new Parent
{
Id= 3,
type = Type.a,
Children = new List<Child>
{
new Child
{
Id = 5,
Status = Status.y,
Date = DateTime.Now.AddDays(-3)
}
}
},
new Parent
{
Id= 4,
type = Type.b,
Children = new List<Child>
{
new Child
{
Id = 6,
Status = Status.y,
Date = DateTime.Now.AddDays(-3)
},
new Child
{
Id = 7,
Status = Status.y,
Date = DateTime.Now.AddDays(-4)
},
new Child
{
Id = 8,
Status = Status.x,
Date = DateTime.Now.AddDays(-4)
}
}
},
}
};
Kết quả của chọn nên một danh sách chứa 2 phụ huynh. Một cho mỗi loại (a và b). Cả hai vẫn chứa tất cả các đối tượng con của chúng.
Có giải pháp đơn giản nào cho việc này không?
tôi đã cố gắng một cái gì đó như:
List<Parent> test = collection.Parents
.GroupBy(m => m.type)
.Select(
m => m.OrderByDescending(
mm => mm.Children.Select(
r => r).OrderByDescending(
r => r.Date)).FirstOrDefault()).ToList();
Nhưng điều đó không kết thúc tốt đẹp.
===== CẬP NHẬT =====
Nhờ ví dụ về vấn đề bí ẩn, vấn đề này được giải quyết. Tôi đã thực hiện một sửa đổi nhỏ đối với truy vấn LINQ vì nội dung gốc mà tôi đang sử dụng được cung cấp bởi Entity Framework (6). Điều này có nghĩa đối với tôi rằng đối tượng Parent đã chọn không chứa bất kỳ Children nào, vì vậy tôi phải chọn một kiểu đối tượng mới (Vì chúng ta không thể khởi tạo một đối tượng mới của kiểu được cung cấp bởi mô hình Entity Framework). Ngoài ra, cha mẹ của tôi đã ở một IEnumerable khác vì vậy tôi đã phải sử dụng một SelectMany trên Cha mẹ là tốt.
Điều này dẫn đến một cái gì đó như thế này: (Điều này sẽ không làm việc với các lớp học thử nghiệm mặc dù)
var result =
collection
.SelectMany(c => c.Parents)
.GroupBy(p => p.type)
.SelectMany(gps =>
gps
.SelectMany(
gp => gp.Children.Where(c => c.Status == Status.y),
(gp, c) => new { gp, c })
.OrderByDescending(gpc => gpc.c.Date)
.Take(1)
.Select(gpc => new ParentData {Id = gpc.gp.Id, Children= gpc.gp.Children}))
.ToList();
Well done để được như vậy mới đây và hỏi một câu hỏi chi tiết như vậy với mã biên dịch được. Hai bản sao chép nhanh và tôi đã có thể chạy mã của bạn. Tôi muốn thêm nhiều người dùng mới là tốt. – Enigmativity