LINQ to SQL 多个左连接查询与连接条件下的子查询
LINQ to SQL multiple left join query with subquery at join condition
我有一个 SQL 查询,它将子查询作为左连接的参数。
SELECT tblfLeaseDetail.Lease_Detail_ID,
tblfPayment.Payment_Date,
tblfAuthorization.Authorized,
tblvVendor.Vendor_Name,
tblvCounty.County
FROM tblfLeaseDetail
LEFT
JOIN tblfPayment
ON tblfPayment.Lease_Detail_ID = tblfLeaseDetail.Lease_Detail_ID
AND tblfPayment.Payment_ID =
( SELECT TOP 1
Payment_ID
FROM tblfPayment
WHERE tblfPayment.Lease_Detail_ID = tblfLeaseDetail.Lease_Detail_ID
ORDER BY Payment_Date DESC
)
LEFT
JOIN tblfAuthorization
ON tblfAuthorization.Lease_Detail_ID = tblfLeaseDetail.Lease_Detail_ID
AND tblfAuthorization.Authorization_ID =
( SELECT TOP 1
Authorization_ID
FROM tblfAuthorization
WHERE tblfAuthorization.Lease_Detail_ID = tblfLeaseDetail.Lease_Detail_ID
ORDER BY Authorized_Date DESC
)
LEFT JOIN tblvVendor
on tblvVendor.Vendor_ID = tblfLeaseDetail.Vendor_ID
LEFT JOIN tblvCounty
on tblvCounty.County_ID = tblfLeaseDetail.County_ID
我正在尝试将其转换为 LINQ。到目前为止,这就是我所做的:
var leaseList = (from l in leases.tblfLeaseDetails
join a in leases.tblfAuthorizations on l.Lease_Detail_ID equals a.Lease_Detail_ID into la
from jla in
(from aj in leases.tblfAuthorizations
where aj.Lease_Detail_ID == l.Lease_Detail_ID
orderby aj.Authorized_Date descending
select aj.Authorization_ID).Take(1).DefaultIfEmpty()
join p in leases.tblfPayments on l.Lease_Detail_ID equals p.Lease_Detail_ID into lp
from jlp in
(from pj in leases.tblfPayments
where pj.Lease_Detail_ID == l.Lease_Detail_ID
orderby pj.Payment_Date descending
select pj.Payment_ID).Take(1).DefaultIfEmpty()
join v in leases.tblvVendors on l.Vendor_ID equals v.Vendor_ID into lv
from jlv in lv.DefaultIfEmpty()
join c in leases.tblvCounties on l.County_ID equals c.County_ID into lc
from jlc in lc.DefaultIfEmpty()
select new LeaseViewModel()
{
Lease_Detail_ID = l.Lease_Detail_ID,
Vendor_Name = jlv.Vendor_Name,
County = jlc.County,
Authorization = jla.Authorized,
Payment_Date = jlp.Payment_Date
}).Distinct()
这个 returns 我在 jla.Authorized 和 jlp.Payment_Date:
'int' 不包含 'Authorized' 的定义,并且找不到接受类型 'int' 的第一个参数的扩展方法 'Authorized'
Payment_Date同样的错误。
为什么 jla 和 jlp 被认为是整数?我怎样才能使这个查询工作?
编辑:
这是最终的有效 LINQ 查询:
var leaseList = (from l in leases.tblfLeaseDetails
join a in leases.tblfAuthorizations on l.Lease_Detail_ID equals a.Lease_Detail_ID into la
from jla in la.DefaultIfEmpty()
where jla.Authorization_ID == (from aj in leases.tblfAuthorizations
where aj.Lease_Detail_ID == l.Lease_Detail_ID
orderby aj.Authorized_Date descending
select aj.Authorization_ID).Take(1).FirstOrDefault()
join p in leases.tblfPayments on l.Lease_Detail_ID equals p.Lease_Detail_ID into lp
from jlp in lp.DefaultIfEmpty()
where jlp.Payment_ID == (from pj in leases.tblfPayments
where pj.Lease_Detail_ID == l.Lease_Detail_ID
orderby pj.Payment_Date descending
select pj.Payment_ID).Take(1).FirstOrDefault()
join v in leases.tblvVendors on l.Vendor_ID equals v.Vendor_ID into lv
from jlv in lv.DefaultIfEmpty()
join c in leases.tblvCounties on l.County_ID equals c.County_ID into lc
from jlc in lc.DefaultIfEmpty()
select new LeaseViewModel()
{
Lease_Detail_ID = l.Lease_Detail_ID,
Lease_ID = l.Lease_ID,
XRef_Lease_ID = l.XRef_Lease_ID,
Vendor_Name = jlv.Vendor_Name,
Description = l.Description,
County = jlc.County,
Amount = l.Amount,
Payment_Due_Date = l.Payment_Due_Date,
Lease_Type = l.Lease_Type.ToString(),
Location_ID = l.Location_ID,
Active = l.Active,
Expiration_Date = l.Expiration_Date,
Authorization = jla.Authorized,
Payment_Date = jlp.Payment_Date
}).Distinct();
那是因为你选择的Authorization_ID和Payment_ID分别是int类型的jla和jlp。试试下面的查询,让我知道它是如何为你工作的。
var leaseList = (from l in leases.tblfLeaseDetails
join a in leases.tblfAuthorizations on l.Lease_Detail_ID equals a.Lease_Detail_ID into la
from jla in
(from aj in leases.tblfAuthorizations
where aj.Lease_Detail_ID == l.Lease_Detail_ID
orderby aj.Authorized_Date descending
select aj).Take(1).DefaultIfEmpty()
join p in leases.tblfPayments on l.Lease_Detail_ID equals p.Lease_Detail_ID into lp
from jlp in
(from pj in leases.tblfPayments
where pj.Lease_Detail_ID == l.Lease_Detail_ID
orderby pj.Payment_Date descending
select pj).Take(1).DefaultIfEmpty()
join v in leases.tblvVendors on l.Vendor_ID equals v.Vendor_ID into lv
from jlv in lv.DefaultIfEmpty()
join c in leases.tblvCounties on l.County_ID equals c.County_ID into lc
from jlc in lc.DefaultIfEmpty()
select new LeaseViewModel()
{
Lease_Detail_ID = l.Lease_Detail_ID,
Vendor_Name = jlv.Vendor_Name,
County = jlc.County,
Authorization = jla.Authorized,
Payment_Date = jlp.Payment_Date
}).Distinct()
我有一个 SQL 查询,它将子查询作为左连接的参数。
SELECT tblfLeaseDetail.Lease_Detail_ID,
tblfPayment.Payment_Date,
tblfAuthorization.Authorized,
tblvVendor.Vendor_Name,
tblvCounty.County
FROM tblfLeaseDetail
LEFT
JOIN tblfPayment
ON tblfPayment.Lease_Detail_ID = tblfLeaseDetail.Lease_Detail_ID
AND tblfPayment.Payment_ID =
( SELECT TOP 1
Payment_ID
FROM tblfPayment
WHERE tblfPayment.Lease_Detail_ID = tblfLeaseDetail.Lease_Detail_ID
ORDER BY Payment_Date DESC
)
LEFT
JOIN tblfAuthorization
ON tblfAuthorization.Lease_Detail_ID = tblfLeaseDetail.Lease_Detail_ID
AND tblfAuthorization.Authorization_ID =
( SELECT TOP 1
Authorization_ID
FROM tblfAuthorization
WHERE tblfAuthorization.Lease_Detail_ID = tblfLeaseDetail.Lease_Detail_ID
ORDER BY Authorized_Date DESC
)
LEFT JOIN tblvVendor
on tblvVendor.Vendor_ID = tblfLeaseDetail.Vendor_ID
LEFT JOIN tblvCounty
on tblvCounty.County_ID = tblfLeaseDetail.County_ID
我正在尝试将其转换为 LINQ。到目前为止,这就是我所做的:
var leaseList = (from l in leases.tblfLeaseDetails
join a in leases.tblfAuthorizations on l.Lease_Detail_ID equals a.Lease_Detail_ID into la
from jla in
(from aj in leases.tblfAuthorizations
where aj.Lease_Detail_ID == l.Lease_Detail_ID
orderby aj.Authorized_Date descending
select aj.Authorization_ID).Take(1).DefaultIfEmpty()
join p in leases.tblfPayments on l.Lease_Detail_ID equals p.Lease_Detail_ID into lp
from jlp in
(from pj in leases.tblfPayments
where pj.Lease_Detail_ID == l.Lease_Detail_ID
orderby pj.Payment_Date descending
select pj.Payment_ID).Take(1).DefaultIfEmpty()
join v in leases.tblvVendors on l.Vendor_ID equals v.Vendor_ID into lv
from jlv in lv.DefaultIfEmpty()
join c in leases.tblvCounties on l.County_ID equals c.County_ID into lc
from jlc in lc.DefaultIfEmpty()
select new LeaseViewModel()
{
Lease_Detail_ID = l.Lease_Detail_ID,
Vendor_Name = jlv.Vendor_Name,
County = jlc.County,
Authorization = jla.Authorized,
Payment_Date = jlp.Payment_Date
}).Distinct()
这个 returns 我在 jla.Authorized 和 jlp.Payment_Date:
'int' 不包含 'Authorized' 的定义,并且找不到接受类型 'int' 的第一个参数的扩展方法 'Authorized'
Payment_Date同样的错误。
为什么 jla 和 jlp 被认为是整数?我怎样才能使这个查询工作?
编辑:
这是最终的有效 LINQ 查询:
var leaseList = (from l in leases.tblfLeaseDetails
join a in leases.tblfAuthorizations on l.Lease_Detail_ID equals a.Lease_Detail_ID into la
from jla in la.DefaultIfEmpty()
where jla.Authorization_ID == (from aj in leases.tblfAuthorizations
where aj.Lease_Detail_ID == l.Lease_Detail_ID
orderby aj.Authorized_Date descending
select aj.Authorization_ID).Take(1).FirstOrDefault()
join p in leases.tblfPayments on l.Lease_Detail_ID equals p.Lease_Detail_ID into lp
from jlp in lp.DefaultIfEmpty()
where jlp.Payment_ID == (from pj in leases.tblfPayments
where pj.Lease_Detail_ID == l.Lease_Detail_ID
orderby pj.Payment_Date descending
select pj.Payment_ID).Take(1).FirstOrDefault()
join v in leases.tblvVendors on l.Vendor_ID equals v.Vendor_ID into lv
from jlv in lv.DefaultIfEmpty()
join c in leases.tblvCounties on l.County_ID equals c.County_ID into lc
from jlc in lc.DefaultIfEmpty()
select new LeaseViewModel()
{
Lease_Detail_ID = l.Lease_Detail_ID,
Lease_ID = l.Lease_ID,
XRef_Lease_ID = l.XRef_Lease_ID,
Vendor_Name = jlv.Vendor_Name,
Description = l.Description,
County = jlc.County,
Amount = l.Amount,
Payment_Due_Date = l.Payment_Due_Date,
Lease_Type = l.Lease_Type.ToString(),
Location_ID = l.Location_ID,
Active = l.Active,
Expiration_Date = l.Expiration_Date,
Authorization = jla.Authorized,
Payment_Date = jlp.Payment_Date
}).Distinct();
那是因为你选择的Authorization_ID和Payment_ID分别是int类型的jla和jlp。试试下面的查询,让我知道它是如何为你工作的。
var leaseList = (from l in leases.tblfLeaseDetails
join a in leases.tblfAuthorizations on l.Lease_Detail_ID equals a.Lease_Detail_ID into la
from jla in
(from aj in leases.tblfAuthorizations
where aj.Lease_Detail_ID == l.Lease_Detail_ID
orderby aj.Authorized_Date descending
select aj).Take(1).DefaultIfEmpty()
join p in leases.tblfPayments on l.Lease_Detail_ID equals p.Lease_Detail_ID into lp
from jlp in
(from pj in leases.tblfPayments
where pj.Lease_Detail_ID == l.Lease_Detail_ID
orderby pj.Payment_Date descending
select pj).Take(1).DefaultIfEmpty()
join v in leases.tblvVendors on l.Vendor_ID equals v.Vendor_ID into lv
from jlv in lv.DefaultIfEmpty()
join c in leases.tblvCounties on l.County_ID equals c.County_ID into lc
from jlc in lc.DefaultIfEmpty()
select new LeaseViewModel()
{
Lease_Detail_ID = l.Lease_Detail_ID,
Vendor_Name = jlv.Vendor_Name,
County = jlc.County,
Authorization = jla.Authorized,
Payment_Date = jlp.Payment_Date
}).Distinct()