按类型和日期LINQ只获取四个对象



我是编程新手,正在寻求任何建议。

我有一份诊所里的病人名单,每个病人都有一个这样的类型:;"孩子"青少年""成年人"老年;还有去看医生的日期。

从患者名单中只能得到四名患者,每种类型一名患者,并有最后一次医生就诊的最新日期。

我可以通过向数据库发出四个单独的请求来做到这一点。

var childPatient = await db.patientsOfClinic.Where(x => x.TypeOfPatient == "child").OrderByDescending(x => x.UploadedDate).FirstOrDefaultAsync();

但需要通过向数据库发出一个请求来处理它。

尝试过这样的请求,但不正确。

var patientsOfClinic = await db.patientsOfClinic.Where(x => x.ClinicId == clinicId && x.TypeOfPatient == "child" && x.TypeOfPatient == "teenager" && x.TypeOfPatient == "adult" && x.TypeOfPatient == "oldage").OrderByDescending(y => y.UploadedDate).ToListAsync();

谢谢你的建议。

var result =  from p in db.patientsOfClinic 
group p by p.TypeOfPatient into grp 
select grp.OrderByDescending(o => o.UploadedDate).FirstOrDefault();

您可以执行以下操作:

首先,根据上传日期对患者进行排序。

然后按类型将它们分组。你将得到4组按日期排序。

从每组中,取第一个也是最新的患者。

这将产生一个由4名患者组成的列表,每组一名,并带有最新的上传日期。

var patients = db.patientsOfClinic.OrderByDescending(patient => patient.UploadDate)
.GroupBy(patient => patient.TypeOfPatient)
.Select(g => g.FirstOrDefault());

此查询需要分组并加入该组。

// make reusable filtered set
var filtered = db.patientsOfClinic.Where(p => x.ClinicId == clinicId);
var grouped = 
from p in filtered
group p by p.TypeOfPatient into g
select new
{
TypeOfPatient = g.Key,
UploadedDate = g.Max(x.UploadedDate)
};
var result = 
from p in filtered
join g in grouped on new { p.TypeOfPatient, p.UploadedDate } 
equals new { g.TypeOfPatient, g.UploadedDate }
select p;

在这种情况下,您可以使用lambda表达式来返回匿名对象,该对象将为您提供带有专利的专利类型列表,其中最大上传日期为true。

测试:

public class PatientsOfClinic
{
public int Id { get; set; }
public int ClinicId { get; set; }
public string TypeOfPatient { get; set; }
public DateTime UploadedDate { get; set; }
}

var listOfPatents = new List<PatientsOfClinic>
{
new PatientsOfClinic
{
Id =1 ,  
ClinicId=1,
TypeOfPatient = "child",
UploadedDate = DateTime.Today
},
new PatientsOfClinic
{
Id =1 ,
ClinicId=1,
TypeOfPatient = "teenager",
UploadedDate = DateTime.Today.AddDays(1)
}
};
var clinicId = 1;
//listOfPatents
//        .Where(c => c.ClinicId == clinicId)
//        .GroupBy(x => x.TypeOfPatient)
//        .Select(g => new
//        {
//            TypeOfPatient = g.Key,
//            Patient = g.OrderByDescending(x => x.UploadedDate)
//                             .FirstOrDefault()
//        });
listOfPatents
.Where(c => c.ClinicId == clinicId)
.GroupBy(x =>  x.TypeOfPatient)
.SelectMany(g => g.Where(u=>u.UploadedDate == g.Max(m =>m.UploadedDate)))
}

从患者列表中获得的问题只有四名患者,每种类型一名患者。。。

当有人说:我需要具有某个属性值的项时,你需要做的第一件事是,你应该想到Queryable的过载之一。按分组

使用这种方法,您可以创建具有一些共同价值的患者组。在您的情况下,您可以创建具有相同属性TypeOfPatient值的患者组。

结果是,您得到一组患者类型值等于Child的患者,以及一组患者类别值等于Adult的患者等。

但你不只是想要一组患者,你想从每个组中选择一个项目。

。。。每种类型的,并有最后一次医生就诊的最新日期。

为此,您可以使用参数resultSelector。此参数是一种具有两个输入值的方法:公共项(在您的情况下为TypeOfPatient(和组中的所有Patient。输出是一个对象。在您的情况下:您希望将具有医生就诊最新数据的组的"患者"作为输出。

IQueryable<Patient> patients = ...
var result = patients.GroupBy(patient => patient.TypeOfPatient,
// parameter resultSelector: take each found TypeOfPatient,
// with all Patients that have this value for TypeOfPatient,
// to make one new:
(typeOfPatient, patientsOfThisType) =>
// order all patients in this group by descending value for UploadedDate
// and take the first
patientsWithOfType.OrderByDescending(patient => patient.UploadedDate)
.FirstOrDefault());

你可以肯定,不会有任何空的组。所以总会有第一个。

最新更新