4 回答
TA贡献1804条经验 获得超2个赞
var answer = (from p in context.Patients
join v in context.PatientVisits on p.ID equals v.PatientID into subs
from sub in subs.DefaultIfEmpty()
group sub by new { p.ID, p.FirstName, p.LastName } into gr
select new
{
gr.Key.FirstName,
gr.Key.LastName,
VisitDate = gr.Max(x => x == null ? null : (DateTime?)x.VisitDate)
}).ToList();
TA贡献1827条经验 获得超8个赞
你可以这样写 Linq
from p in Patients
join pv in PatientVisits on p.PatientID equals pv.id into jointable
from z in jointable.DefaultIfEmpty()
select new
{
p.FirstName,
p.LastName,
pv.VisitDate,
};
TA贡献1811条经验 获得超4个赞
我的建议是:
public class Patient
{
public int PatientId { get; set; }
public string Name { get; set; }
}
public class PatientVisit
{
public Patient Patient { get; set; }
public DateTime VisitDate { get; set; }
}
class Program
{
static void Main(string[] args)
{
Patient p1 = new Patient();
p1.PatientId = 1;
p1.Name = "Harry";
Patient p2 = new Patient();
p2.PatientId = 2;
p2.Name = "John";
List<PatientVisit> visits = new List<PatientVisit>();
visits.Add(new PatientVisit
{
Patient = p1,
VisitDate = DateTime.Now.AddDays(-5)
});
visits.Add(new PatientVisit
{
Patient = p1,
VisitDate = DateTime.Now
});
visits.Add(new PatientVisit
{
Patient = p2,
VisitDate = DateTime.Now.AddDays(-1)
});
var q = (from t in visits
select new
{
t.Patient.Name,
t.Patient.PatientId,
t.VisitDate
}).OrderByDescending(t=>t.VisitDate).GroupBy(x => new { x.PatientId });
foreach (var item in q)
{
Console.WriteLine(item.FirstOrDefault().Name + ", " + item.FirstOrDefault().VisitDate);
}
}
}
TA贡献1799条经验 获得超9个赞
如果您的类定义具有虚拟 ICollection,则可以使用它们:
public class Patient
{
public int Id { get; set; }
...
// every Patient has zero or more Visits (one-to-many)
public virtual ICollection<Visit> Visits {get; set;}
}
public class Visit
{
public int Id {get; set;}
public DateTime VisitDate { get; set; }
...
// Every Visit is done by exactly one Patient, using foreign key
public int PatiendId {get; set;}
public virtual Patient Patient { get; set; }
}
要求:给我每个病人他的最新就诊时间
var result = dbContext.Patients
.Where(patient => ...) // only if you don't want all Patients
.Select(patient => new
{
// Select from every Patient only the properties you plan to use
Id = patient.Id,
Name = patient.Name,
...
LastVisitTime = patient.Visits
.OrderByDescenting(visit => visit.VisitDate)
.FirstOrDefault(),
});
如果您无法使用虚拟 ICollections,则必须自己执行 Group Join:
var result = dbContext.Patients.GroupJoing(dbContext.Visits,
patient => patient.Id, // from every Patient take the Id
visit => visit.PatientId, // from every Visit take the PatientId,
(patient, visits) => new // use every patient with all his matching Visits
{ // to make a new object
Id = patiend.Id,
Name = patient.Name,
...
LastVisit = visits.OrderByDescending(visit => visit.VisitDate)
.FirstOrDefault(),
});
- 4 回答
- 0 关注
- 91 浏览
添加回答
举报