为 orderby 创建子查询

问题描述 投票:0回答:2

我有两个相关的表集合和项目。

我想根据收藏属性订购选定的物品。

收藏

class Collection
{
    int Id;
    string Title;
    bool Override;
    int Level;
    Datetime Till;
    int OtherProp;
    virtual ICollection<Item> Items{ get; set; }
}

物品

class item
{
    int Id;
    int OrderId;
    string Title;
    virtual Collection Collection{ get; set; }
}

我想选择所有项目并按以下顺序排序:

  1. 订单覆盖为真的所有项目;
  2. 订单级别等于 1 且直到小于 Datetime.Now() 的所有项目;
  3. 订单级别等于 2 且直到小于 Datetime.Now() 的所有项目;
  4. 所有其他项目。

看起来像

var resultList = await _context.Items.Where(item=> item.OtherProp == 1)
   .OrderBy(item => ??????????????)
   .ThenBy(item=> item.Title).ToListAsync();
entity-framework linq
2个回答
0
投票

尝试以下查询:

var resultList = await _context.Items
    .Where(item=> item.OtherProp == 1)
    .OrderByDescending(item => item.Collection.Override)
    .ThenByDescending(item => item.Collection.Till <= Datetime.Now() && item.Collection.Level == 1)
    .ThenByDescending(item => item.Collection.Till <= Datetime.Now() && item.Collection.Level == 2)
    .ThenBy(item => item.Title)
    .ToListAsync();

0
投票
var resultList = await _context.Items
    .Where(item => item.OtherProp == 1)
    .OrderBy(item =>
        item.Collection.Override ? 0 :
        (item.Collection.Level == 1 && item.Collection.Till < DateTime.Now) ? 1 :
        (item.Collection.Level == 2 && item.Collection.Till < DateTime.Now) ? 2 : 3)
    .ThenBy(item => item.Title)
    .ToListAsync();

您可以使用三元运算符尝试此查询 它执行以下步骤:

  • 如果项目集合的 Override 属性设置为 true,则排序值 = 0。
  • 如果项目的集合的级别等于 1 并且 Till 小于 DateTime.Now,排序值 = 1.
  • 如果项目集合的 Level 等于 2 且 Till 小于 DateTime.Now,则排序值 = 2.
  • 否则,商品订购价值 = 3.
© www.soinside.com 2019 - 2024. All rights reserved.