加入和组的 LINQ 最大日期

LINQ max date with join and group

我想不通并测试了类似问题的一些答案。 现在我需要一个linq pro。 :)

以下使用 linq returns 的查询每个 device.storeID 和 device.deviceID 具有 DeviceList 中的最大日期:

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)
});

我得到的结果比我需要的多。对我来说这似乎是合乎逻辑的,但是我可以在没有分组的情况下获得 amount 吗?我不需要 device.storeID 和 device.deviceID 以及 DeviceList 中每个金额的最大日期。

哦,顺便说一句:如您所见,我尝试加入商店并键入以获取 store/device 名称。我如何添加:

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

???

感谢您的每一个有用提示!

@拉法尔:谢谢!也许我的查询有更简单的解决方案。所以我必须解释我想从数据库中读取什么。

table 设备包含:

device.id    device.deviceID    device.storeID    device.amount    device.Date
123               52                     20            10          2021-11-11
124               57                     20             5          2021-12-01
125               57                     20             2          2021-12-02
126               52                     20             8          2021-12-03
127               52                     21             3          2021-12-03

因此,我需要每个不同的 storeID 和最后一个 (max/highest) 日期的数量的每个不同的 deviceID:

   device.id    device.deviceID    device.storeID    device.amount    device.Date
    125               57                     20             2       2021-12-02
    126               52                     20             8       2021-12-03
    127               52                     21             3       2021-12-03

如果您稍等片刻并在 sql 中编写相同的查询,您将同样意识到不能 select 从这些组中编辑数量,只是因为您的商店和设备组中有多个值.正如@Juharr 所指出的,您可以对金额进行汇总,因为您很可能想知道这些金额的总和,而不是从组中随机取一个?或者也许您知道您需要哪一个?最大日期的那个?

如果您所追求的最大日期比您需要在分组依据和 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 
         && x.storeID == s.storeID 
         && s.MaxDate == x.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 为您生成查询的能力,增加您的工作量,因为您需要考虑关系和外键,而不是考虑需求是什么。您应该默认使用 Navigation Properites,当 EF 无法创建正确的代码时,您可以回退以加入语法并修复查询。通常 EF 查询就足够了。