旧ADO.NET查询的LINQ查询

pgky5nke  于 5个月前  发布在  .NET
关注(0)|答案(2)|浏览(69)

我不习惯使用LINQ编写JOIN语句。我正在尝试将这个旧查询转换为LINQ Lambda语法,并努力理解如何进行。任何帮助都将非常感谢。

SELECT p.id, p.code, u.email, b.date
FROM 
Patients p
LEFT JOIN Users u
ON u.patientid =p.id and u.id=p.primarycontactid
INNER JOIN BillingSettings b ON b.PracticeId = p.id and b.isDue=1
WHERE p.status=1
AND p.appointmentdate > now() and p.appointmentdate < now() + 90
and b.expirationdate < now()
order by p.id

字符串

rm5edbpk

rm5edbpk1#

我写这个没有编译器,所以它可能是错误的,但通常你的答案是下面。

var now = DateTime.Now();

var query = 
    from p in db.Patients 
    join u in db.Users on new { patientid = p.id, p.primarycontactid} equals { u.patientid, primarycontactid = u.id}
    from u in userPatient.DefaultIfEmpty()
    join b in db.BillingSettings on b.PracticeId equals p.id
    where p.status == 1 &&
        p.appointmentdate > now && p.appointmentdate < now.AddDays(90) &&
        (b == null || (b.isDue == 1 && b.expirationdate < now))
    orderby p.id
    select new
    {
        p.id,
        p.code,
        email = u.email
        date = b.date 
    };

字符串

busg9geu

busg9geu2#

LINQ不是嵌入式SQL,它是ORM的查询语言。ORM处理对象,而不是表。ORM本身,EF,将基于 * 实体 * 及其关系生成任何JOIN。要给予一个好的答案,需要知道实际实体的样子。
假设一个病人有一个UserBillingSetting属性,LINQ查询可能是这样的:

var overduePatients= context.Patients
                    .Where(p=>p.AppointmentDate > DateTime.Today && 
                              p.AppointmentDate < DateTime.Today.AddDays(90) &&
                              p.BillingSetting.ExpiratonDate < DateTime.Today 
                              && p.BillingSetting.IsDue)
                    .Select(p=>new { p.Id, 
                                     p.Code, 
                                     p.User.Email,
                                     p.BillingSetting.Date
                                   });

字符串
不需要显式JOIN。EF Core将从Patient.BillingSettingsPatient.User导航属性及其元数据生成JOIN。
生成的查询将把日期值作为参数传递,而不是像GetDate()Now()这样的特定于产品的调用
如果BillingSettings是一个1-Many关系,这意味着我们真正想要的是过期的账单,而不是病人。在这种情况下,查询将不得不从账单开始:

var overdueBills= context.BillingSettings
                    .Where(b=>b.Patient.AppointmentDate > DateTime.Today && 
                              b.Patient.AppointmentDate < DateTime.Today.AddDays(90) &&
                              b.ExpiratonDate < DateTime.Today 
                              && b.IsDue)
                    .Select(b=>new { b.Patient.Id, 
                                     b.Patient.Code, 
                                     b.Patient.User.Email,
                                     b.Date
                                   });

相关问题