簡體   English   中英

LINQ查詢W /子查詢和最大

[英]Linq query w/ sub query and max

如何將此SQL重寫為Linq查詢?

普通SQL

SELECT *
FROM contracts
    INNER JOIN
        (SELECT contractid, max(date) date 
        FROM contractlogs GROUP BY contractId) b 
    ON contracts.id = b.contractId

嘗試使用Linq

from c in _db.Contracts
join sub in (from cl in _db.ContractLogs
             group cl by cl.contractId into g
             select new { contractId = g.contractId, changedate = g.Max(x => x.date)})
    on c.id equals sub.contractId 
select new { c, cl }

該查詢的目標是選擇所有帶有最新更新的合同(第一個)(在contractLogs中)。 我目前對選擇的工作方式感到困惑。 理想情況下,我嘗試使用c&cl返回對象。

您可以按照降序排序並獲取第一個日志來獲取最新日志:

from c in _db.Contracts
let mostRecentContractLog = c.ContractLogs
                             .OrderByDescending(cl => cl.date)
                             .FirstOrDefault()
select new { c, mostRecentContractLog }

如您所見,我假設您具有導航屬性Contract.ContractLogs 始終強烈建議您使用導航屬性來代替手動編碼的聯接。

在這種情況下,分別編寫查詢和子查詢通常更容易:

var subQuery =
    from cl in _db.ContractLogs
    group cl by cl.contractId into g
    select new { contractId = g.Key, date = g.Max(cl => cl.date) };

var query =
    from c in _db.Contracts
    join cl in subQuery on c.contractId equals cl.contractId
    select new { contract = c, cl.date };

最直接的翻譯將涉及您在ContractLogs上調用groupby,然后將其加入到Contacts中。 我認為您在LINQ嘗試中的操作順序有些偏離,但是我不經常使用查詢語法,因此我對此並不樂觀。 無論如何,我認為您更喜歡這樣的東西;

_db.ContractLogs.GroupBy(x => x.contractId).Select(x => new { contractid = x.Key, changedate = x.Max(y => y.date) })

這樣,您就可以連接到_db.Contracts了,但是我認為您可以使用LINQ to SQL提供程序可能不太優化的位置來編寫它。 無論如何,只需用一個連接完成示例;

OldQuery.Join(_db.Contracts, cl => cl.contractid,
              c => c.contractid, (cl, c) => cl);

您可以嘗試以下方法:

from c in _db.Contracts
select new 
{ 
   c, 
   cl = _db.ContractLogs.Where(l => l.contractId == c.contractId).OrderByDescending(l => l.date).FirstOrDefault() 
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM