Linq返回的结果与SQL不同

时间:2014-12-18 22:49:59

标签: c# asp.net linq linq-to-sql

我正在运行此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

我认为这些查询是一样的,有什么不同,哪一个是正确的?

2 个答案:

答案 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)第二个问题是过滤并取出给定诊所的患者,确保这些患者存在于某些计划中。

当然,结果的数量会有所不同,因为患者和计划表中的行数可能不同。