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.Authorizedjlp.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()