簡體   English   中英

LINQ 加入和組的最大日期

[英]LINQ max date with join and group

我無法弄清楚並測試了類似問題的一些答案。 現在我需要一個 linq pro。 :)

以下使用 linq 的查詢返回 DeviceList 中的每個 device.storeID 和 device.deviceID 以及最大日期:

var query = (from device in db.DeviceList
        join store in db.stores on device.storeID equals store.id
        join type in db.devices on device.deviceID equals type.id
        group device by new { device.storeID, device.deviceID } into g
        select new
        {
            deviceID = g.Key.deviceID,
            storeID = g.Key.storeID,
            MaxDate = g.Max(d => d.Date)
        });

在設備中還有 device.amount,但我無法訪問:

var query = (from device in db.DeviceList
            join store in db.stores on device.storeID equals store.id
            join type in db.devices on device.deviceID equals type.id
            group device by new { device.storeID, device.deviceID } into g
            select new
            {
                amount = device.amount,
                deviceID = g.Key.deviceID,
                storeID = g.Key.storeID,
                MaxDate = g.Max(d => d.Date)
            });

因為不在群里。 但是,如果我添加到組中:

group device by new { device.storeID, device.deviceID, device.amount } into g
select new
{
    amount = g.Key.amount,
    deviceID = g.Key.deviceID,
    storeID = g.Key.storeID,
    MaxDate = g.Max(d => d.Date)
});

我得到的結果比我需要的要多。 什么對我來說似乎是合乎邏輯的,但我可以在沒有分組的情況下獲得金額嗎? 對於 DeviceList 中的每個數量,我不需要具有最大日期的 device.storeID 和 device.deviceID。

哦,順便說一句:如您所見,我嘗試加入商店並輸入以獲取商店/設備名稱。 我該如何添加:

select new
{
    deviceName = type.name,
    deviceID = g.Key.deviceID,
    storeID = g.Key.storeID,
    MaxDate = g.Max(d => d.Date)
});

???

感謝您提供的每一個有用的提示!

如果您稍停片刻並在 sql 中編寫相同的查詢,您將同樣意識到無法從這些組中選擇數量,因為您的商店和設備組中有多個值。 正如@Juharr 所指出的,您可以對金額進行聚合,因為您很可能想知道這些金額的總和,而不是從組中隨機抽取一個? 或者你知道你需要哪一個? 最大日期的那個?

如果您之后的最大日期比您需要在 group by 和 select 之后加入設備:

var query = (from device in db.DeviceList
        join store in db.stores on device.storeID equals store.id
       group device by new { device.storeID, device.deviceID } into g
        select new
        {
           
            deviceID = g.Key.deviceID,
            storeID = g.Key.storeID,
            MaxDate = g.Max(d => d.Date)
        }) into s
        let dev = db.devices.FirstOrDefault(x => x.deviceID == s.deviceID && s.MaxDate == dev.Date)
        join type in db.devices on dev.deviceID equals type.id
        select new {
            s.deviceID,
            s.storeID,
            s.MaxDate,
            dev.amount,
            type.name
         };

這也不是完美的,因為您可以有多個設備記錄具有相同的日期恰好是最大的,所以它會(半)隨機選擇一個,或者您可以在 FirstOrDefault 之前添加一些訂單

簡短的回答是您沒有正確定義要從數據庫中讀取的關於該數量或類型的內容。


另外作為專業提示,除非您必須,否則不要使用連接語法。 默認情況下,以這種方式編寫查詢會降低 EF 為您生成查詢的能力,增加您的工作量,因為您需要考慮關系和外鍵而不是需求。 您應該默認使用導航屬性,當 EF 無法創建正確的代碼時,您可以退回到連接語法並修復查詢。 通常情況下,EF 查詢就足夠了。

暫無
暫無

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

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