【问题标题】:LINQ to SQL multiple left join query with subquery at join conditionLINQ to SQL 多左连接查询与连接条件中的子查询
【发布时间】:2016-02-17 21:17:14
【问题描述】:

我有一个 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()

这会在 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();

【问题讨论】:

  • 因为在 jla 中您选择了 aj.Authorization_ID 这是一个 int。尝试改为select aj
  • 跑题了,但是使用视图不是更容易吗?
  • 当我尝试使用 aj 时,VS 说它在当前上下文中不存在。当我尝试使用 la 时,VS 说它不存在'不包含授权的定义。
  • 我需要从 Authorization 和 Payment 表中选择 ID,因为如果没有它们,我将获得同一个 Lease_Detail_ID 的多个结果。另外,我仍然不明白为什么 jlv 和 jlc 是范围变量而 jla 和 jlp 是整数。这是因为我的子查询返回的类型吗?

标签: sql sql-server linq join subquery


【解决方案1】:

那是因为您选择的 Authorization_ID 和 Payment_ID 分别是 jla 和 jlp 中的 int 类型。试试下面的查询,让我知道它是如何为你工作的。

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

【讨论】:

  • 谢谢舒布!这帮助很大!我用我的最终 LINQ 查询编辑了这篇文章,这基本上是你的,只是做了一些更改。它现在正在工作!
猜你喜欢
  • 2020-06-12
  • 1970-01-01
  • 1970-01-01
  • 2015-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
相关资源
最近更新 更多