【问题标题】:How to limit a LINQ query based on date and a secondary ID如何根据日期和辅助 ID 限制 LINQ 查询
【发布时间】:2020-01-14 23:27:14
【问题描述】:

我有以下产品表:

Id
ProductName
ProductType
IsActive
SecondaryId

所以记录看起来像:

ID: 1
ProductName: product1
IsActive: true
SecondaryId: 333
CreatedOn: 1/14/2020

Id: 2
ProductName: product2
IsActive: true
SecondaryId: 333
CreatedOn: 1/13/2020

Id: 3
ProductName: product3
IsActive: true
SecondaryId: 221
CreatedOn: 1/13/2020

然后使用以下查询来检索它们:

var products = _context.Product
    .Where(x.IsActive)
    .OrderBy(x => x.CreatedOn)
    .ToDTOs();

SecondaryId 是一个字段,用于在创建新产品时克隆产品的某些部分。所以用户可以进来,选择一个现有的产品,然后它继承那个secondaryID。然后,我们使用 SecondaryID 来跟踪产品的更新。从技术上讲,我们应该有另一张桌子来做这件事,但做出决定时我不在。

我要做的是编写选择查询,以便它将返回数据库中的所有产品,但对于具有现有 SecondaryID 的产品,只返回最新的产品。所以说存在四个具有相同 SecondaryID 的产品,我只希望列表中包含最近的一个。所以在我的例子中

LINQ 较新,但卡住了。

【问题讨论】:

  • 能否请您添加一些数据和预期结果

标签: c# linq


【解决方案1】:

你可以使用GroupBy:

var products = _context.Product
    .Where(x => x.IsActive)
    .GroupBy(x => x.SecondaryId)
    .Select(grp => grp.OrderByDescending(x => x.CreatedOn).First())
    .ToDTOs();

然后在每个组中,选择CreatedOn最高的对象。

【讨论】:

  • 谢谢你,这让我到达了我需要的地方
【解决方案2】:

您需要按次要 ID 进行分组,然后只取每个分组的第一行,如下所示:

var products = _context.Product
                       .Where(x => x.IsActive)
                       .GroupBy(x => x.SecondaryID)
                       .Select(x => x.OrderByDesc(y => y.CreatedOn).First())
                       .OrderBy(x => x.CreatedOn)
                       .ToDTOs();

编辑:错过了您特别想要每个分组中最新的 - Select 语句中的 OrderByDesc 应该可以解决问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-17
    • 2017-12-10
    相关资源
    最近更新 更多