一尘不染

LINQ中的JOIN和LEFT JOIN等效项

sql

我正在使用以下SQL查询:

SELECT 
a.AppointmentId,
a.Status,
a.Type,
a.Title,
b.Days,
d.Description,
e.FormId
FROM Appointment a (nolock)
LEFT JOIN AppointmentFormula b (nolock)
ON a.AppointmentId = b.AppointmentId and b.RowStatus = 1
JOIN Type d (nolock)
ON a.Type = d.TypeId
LEFT JOIN AppointmentForm e (nolock)
ON e.AppointmentId = a.AppointmentId
WHERE a.RowStatus = 1
AND a.Type = 1
ORDER BY a.Type

我不确定如何在LINQ中实现JOIN。我所有的表都具有外键关系。


阅读 157

收藏
2021-03-17

共1个答案

一尘不染

您可能需要在我袖手旁观时略微调整一下,但是需要牢记一些主要事项。如果您在dbml中正确设置了关系,则应该能够隐式进行内部联接,并且只需通过初始表访问数据即可。此外,LINQ中的左联接并不像我们希望的那样简单明了,您必须使用DefaultIfEmpty语法才能使其实现。我在这里创建了一个匿名类型,但是您可能想要放入DTO类或类似的东西。对于空值,我也不知道您想做什么,但是您可以使用??。语法,用于定义一个值,如果该值为null,则将其赋给变量。如果您还有其他问题,请告诉我…

var query = (from a in context.Appointment
join b in context.AppointmentFormula on a.AppointmentId equals b.AppointmentId into temp
from c in temp.DefaultIfEmpty()
join d in context.AppointmentForm on a.AppointmentID equals e.AppointmentID into temp2
from e in temp2.DefaultIfEmpty()
where a.RowStatus == 1 && c.RowStatus == 1 && a.Type == 1
select new {a.AppointmentId, a.Status, a.Type, a.Title, c.Days ?? 0, a.Type.Description, e.FormID ?? 0}).OrderBy(a.Type);
2021-03-17