我需要在下面写下 sql 查询linq
。我为此编写linq
了没有子查询部分的查询。我不知道如何编写子查询linq
select * from PART_TYPE Pt
left join
(select * from PART_AVAILABILITY where DATE_REF = '2013-06-20')pa
on Pt.PART_TYPE_ID = pa.PART_TYPE_ID
where Pt.VEHICLE_ID = 409
我怎样才能做到这一点 ?
我需要在下面写下 sql 查询linq
。我为此编写linq
了没有子查询部分的查询。我不知道如何编写子查询linq
select * from PART_TYPE Pt
left join
(select * from PART_AVAILABILITY where DATE_REF = '2013-06-20')pa
on Pt.PART_TYPE_ID = pa.PART_TYPE_ID
where Pt.VEHICLE_ID = 409
我怎样才能做到这一点 ?
这应该非常接近:
var query = from pt in part_type
join pa in part_availability
on new { pt.part_type_id, '2013-06-20' }
equals new { pa.part_type_id, pa.date_ref }
from x in grp.DefaultIfEmpty()
select new { part_type = pt,
part_availability = x) };
编辑:在我看来,日期可能是一个问题——很容易解决创建一个DateTime
对象并使用它而不是字符串值的问题。
from pt in context.PART_TYPE
join pa in
(
(from PART_AVAILABILITY in context.PART_AVAILABILITY
where
PART_AVAILABILITY.DATE_REF == dt
select new
{
PART_AVAILABILITY
}
)
)
on new { PART_TYPE_ID = pt.PART_TYPE_ID } equals new { PART_TYPE_ID = pa.PART_AVAILABILITY.PART_TYPE_ID } into pa_join
from pa in pa_join.DefaultIfEmpty()
where
pt.VEHICLE == 409
select new
{
PART_TYPE = pt,
PART_AVAILABILITY = pa.PART_AVAILABILITY
};
dt
是DateTime
对象。
假设所有表都映射到DbContext context
from pt in context.PART_TYPES
join pa in context.PART_AVAILABILITIES on
pt.PART_TYPE_ID equals pa.PART_TYPE_ID
where pt.VEHICLE_ID == 409 &&
pa.DATE_REF.Any(r => r.DATE_REF == "2013-06-20")
select new { pt, pa };
如果在 上存在 FK 关系PART_TYPE_ID
:
from pt in context.PART_TYPES
where pt.VEHICLE_ID == 409 && pt.PART_AVAILABILITY.DATE_REF == "2013-06-20"
select pt;