Entity Framework - GroupBy 然后 OrderBy
Entity Framework - GroupBy then OrderBy
我有一组记录,其中包括 PatientID 和约会日期。
我想按 PatientID 对它们进行分组,并按每个 PatientID 组中最早的预约对组进行排序。像这样...
ID ApptDate
----------------------
3 2/5/2005 (oldest compared to all groups , so group "ID = 3" is sorted first)
3 5/10/2006
3 6/2/2010
1 8/5/2007
1 9/1/2015
2 6/15/2009
2 9/19/2009
我很确定我需要先使用分组来获取每个 ID 的最早日期值,然后按该值排序,但我无法理解这两个函数将如何协同工作。
var query = from a in db.Appointments
group a by new { a.Id, a.ApptDate} into pa
select new {
ID = pa.Key.Id,
Date = pa.Min(x =>x.ApptDate) ...
...但此时我崩溃了。
任何帮助表示赞赏。
在我的情况下它工作正常...
var query = from a in db.Appointments
group a by new { a.Id, a.ApptDate} into pa
select new {
ID = pa.Key.Id,
Date = pa.Max(x =>x.ApptDate)
}).Select(x=>new {
x.ID,x.Date
}).ToList();
db.Appointments.GroupBy(new {ID = item.ID, ApptDate = item.ApptDate}).OrderByDescending(item => item.ApptDate)
你的要求如下(虽然问题中没有提到其中之一,但从数据的布局来看是显而易见的):
- 根据患者 ID 分组。
- 根据每个组中最早的约会日期对组进行排序。
- 根据预约日期对组内的数据进行排序。
var query = records.GroupBy(r => r.PatientId) // Group patients
.OrderBy(g => g.Min(r => r.AppointmentDate)) // sort groups by oldest record in each
.Select(g =>
new
{
PatientId = g.Key,
Records = g.OrderBy(r => r.AppointmentDate) // sort records within a group by oldest
});
我稍微修改了 Tanveer Badar 的回答 return 每个实体一行。
为您的 return 数据创建一个 class
public class ReturnType
{
public int ID { get; set; }
public DateTime AppDate { get; set; }
}
获取一组ID和可枚举的有序日期
var result = db.Appointment
.GroupBy(a => a.Id)
.OrderBy(a => a.Min(n => n.Date))
.Select(a => new { ID = a.Key, AppDates = a.OrderBy(na =>
na.Date).Select(ne => ne.Date) })
.ToList();
然后展平 returned 列表。我尝试使用 SelectMany 但没有成功。
var results = new List<ReturnType>();
foreach (var a in result)
{
foreach (var date in a.AppDates)
{
var returnType = new ReturnType
{
ID = a.ID,
AppDate = date
};
results.Add(returnType);
}
}
我有一组记录,其中包括 PatientID 和约会日期。
我想按 PatientID 对它们进行分组,并按每个 PatientID 组中最早的预约对组进行排序。像这样...
ID ApptDate
----------------------
3 2/5/2005 (oldest compared to all groups , so group "ID = 3" is sorted first)
3 5/10/2006
3 6/2/2010
1 8/5/2007
1 9/1/2015
2 6/15/2009
2 9/19/2009
我很确定我需要先使用分组来获取每个 ID 的最早日期值,然后按该值排序,但我无法理解这两个函数将如何协同工作。
var query = from a in db.Appointments
group a by new { a.Id, a.ApptDate} into pa
select new {
ID = pa.Key.Id,
Date = pa.Min(x =>x.ApptDate) ...
...但此时我崩溃了。
任何帮助表示赞赏。
在我的情况下它工作正常...
var query = from a in db.Appointments
group a by new { a.Id, a.ApptDate} into pa
select new {
ID = pa.Key.Id,
Date = pa.Max(x =>x.ApptDate)
}).Select(x=>new {
x.ID,x.Date
}).ToList();
db.Appointments.GroupBy(new {ID = item.ID, ApptDate = item.ApptDate}).OrderByDescending(item => item.ApptDate)
你的要求如下(虽然问题中没有提到其中之一,但从数据的布局来看是显而易见的):
- 根据患者 ID 分组。
- 根据每个组中最早的约会日期对组进行排序。
- 根据预约日期对组内的数据进行排序。
var query = records.GroupBy(r => r.PatientId) // Group patients
.OrderBy(g => g.Min(r => r.AppointmentDate)) // sort groups by oldest record in each
.Select(g =>
new
{
PatientId = g.Key,
Records = g.OrderBy(r => r.AppointmentDate) // sort records within a group by oldest
});
我稍微修改了 Tanveer Badar 的回答 return 每个实体一行。
为您的 return 数据创建一个 class
public class ReturnType
{
public int ID { get; set; }
public DateTime AppDate { get; set; }
}
获取一组ID和可枚举的有序日期
var result = db.Appointment
.GroupBy(a => a.Id)
.OrderBy(a => a.Min(n => n.Date))
.Select(a => new { ID = a.Key, AppDates = a.OrderBy(na =>
na.Date).Select(ne => ne.Date) })
.ToList();
然后展平 returned 列表。我尝试使用 SelectMany 但没有成功。
var results = new List<ReturnType>();
foreach (var a in result)
{
foreach (var date in a.AppDates)
{
var returnType = new ReturnType
{
ID = a.ID,
AppDate = date
};
results.Add(returnType);
}
}