我正在运行此Linq查询:
var patientList = from p in db.Patients
where p.ClinicId==11
select p.Id;
var patientswithplan = from p in db.Plans
where patientList.Contains(p.PatientId)
select p;
它返回1030个结果。
但是当我想出这个查询时,我首先在sql中编写它来测试它,这显示956结果
select id from patients where clinicid=11
and id in(select patientid from plans)
order by id
我认为这些查询是一样的,有什么不同,哪一个是正确的?
答案 0 :(得分:2)
我写了一些代码然后你可以自己看到差异
void Main()
{
var Plans = new List<Plan>();
Plans.Add(new Plan() {PatientId = 1, PlanName = "Good Plan"});
Plans.Add(new Plan() {PatientId = 2, PlanName = "Bad Plan"});
var Patients = new List<Patient>();
Patients.Add(new Patient() {ClinicId = 1, Name = "Frank"});
Patients.Add(new Patient() {ClinicId = 2, Name = "Fort"});
// This is your LINQ
var patientList = from p in Patients
where p.ClinicId == 1
select p.ClinicId;
var patientswithplan = from p in Plans
where patientList.Contains(p.PatientId)
select p;
Console.WriteLine(patientswithplan);
// We return a PLAN here
// Result
// IEnumerable<Plan> (1 item)
// PatientId 1
// PlanName Good Plan
// This is the equivalent Linq of your SQL
var myPatient = Patients.Where(
pa => pa.ClinicId == 1 &&
Plans.Any(pl => pl.PatientId == pa.ClinicId)
);
Console.WriteLine(myPatient);
// Look! We return a PATIENT here
// Result
// IEnumerable<Patient> (1 item)
// ClinicId 1
// Name Frank
}
// Define other methods and classes here
class Patient
{
public Patient() {}
public int ClinicId { get; set; }
public string Name { get; set; }
}
class Plan
{
public Plan() {}
public int PatientId { get; set; }
public string PlanName { get; set; }
}
答案 1 :(得分:1)
查询做了两件不同的事情:
1)第一个查询基本上首先得到一个患者列表,然后它的提取计划(你选择&#34;来自db.Plans&#34中的p;)那些选择的患者在他们的病人名单。
2)第二个问题是过滤并取出给定诊所的患者,确保这些患者存在于某些计划中。
当然,结果的数量会有所不同,因为患者和计划表中的行数可能不同。