【问题标题】:EF Core 3.0 conditional order by in LINQ when the condition is validated in DB当在 DB 中验证条件时,在 LINQ 中的 EF Core 3.0 条件排序
【发布时间】:2020-02-27 19:30:26
【问题描述】:

以下是我需要解决的问题的一个相当简单的示例。我正在使用EF Core 3.0LINQ,我需要按特定顺序从数据库中获取所有的人。首先,我需要所有具有Feature classUntil 属性大于DateTime.Now 的人,由At 属性降序排列,然后由Id 属性从Guy class 降序排列。

public class Guy
{
    public int Id {get;set;}
    public Feature Feature {get;set;}
}
public class Feature
{
    public int Id {get;set;}
    public DateTime? At {get;set;}
    public DateTime? Until {get;set;}
}

_dbcontext.Guys.Add(new Guy{Id = 1, Feature = new Feature {At = DateTime.Now.AddDays(-1), Until = DateTime.Now.AddDays(7)}})
_dbcontext.Guys.Add(new Guy{Id = 2, Feature = new Feature {At = DateTime.Now.AddDays(3), Until = DateTime.Now.AddDays(7)}})
_dbcontext.Guys.Add(new Guy{Id = 3})
_dbcontext.Guys.Add(new Guy{Id = 4})

例如_dbcontext.Guys.Include(x => x.Feature).OrderByDescending(x => x.Feature.Until > DateTime.Now ? x.Feature.At : DateTime.Now).ThenByDescending(x => x.Id).ToList(); 应该首先返回带有Id 1 的Guy,因为Feature.At 属性大于DateTime.Now,其余的应该按Id 属性降序排序。 Id 4, Id 3 然后Id 1

不幸的是,这个例子有点工作,但问题是,首先它将返回没有Feature class 的那些(按Id 属性降序排列),然后是有Feature class 的那些At 大于 DateTime.Now。同样,这些是由 Until 属性正确排序的,但它们应该在顶部。

任何帮助将不胜感激。

【问题讨论】:

  • 如果 Until 属性小于 DateTime.Now,它应该是结果集的一部分吗?
  • 是的,它们都应该被返回,但是如果Until 属性小于DateTime.Now,它是由它的Id 排序的。意思是首先所有Until 大于DateTime.Now 的人按他们的At 属性降序排序,然后其余的人按他们的Id 降序排序

标签: c# linq entity-framework-core


【解决方案1】:

LINQ order by null column where order is ascending and nulls should be last

添加一个条件来过滤值是否为空。例如,请参阅上面的帖子。

_dbcontext.Guys
.Include(x => x.Feature)
.OrderByDescending(x => x.Feature != null)
.ThenBy(x => x.Feature.Until > DateTime.Now ? x.Feature.At : DateTime.Now)
.ThenByDescending(x => x.Id).ToList();

编辑:

_dbcontext.Guys
.Include(x => x.Feature)
.OrderByDescending(x => x.Feature!= null && x.Feature.Until > DateTime.Now ? x.Feature.At : DateTime.Now)
.ThenByDescending(x => x.Id).ToList();

我在控制台应用程序中运行它,结果为 2,4,3,1

【讨论】:

  • 感谢您的回答,但它不正确。如果我运行它,它将返回 1、2、4、3,但 Id 1 应按其 Id 属性排序,因此正确结果将是 2,4,3,1。所有的排序也应该是降序的。
  • 啊,我明白了。我刚刚复制并测试并得到 2,4,3,1。答案已编辑
  • 格兰特,我还没有看到答案有任何变化:(
  • 立即刷新,如果有帮助请告诉我
  • 我不明白为什么,但是如果您将OrderByDescending 更改为OrderBy 就可以了。否则我会得到完全错误的答案。谢谢格兰特
猜你喜欢
  • 2019-12-03
  • 1970-01-01
  • 2020-01-25
  • 1970-01-01
  • 1970-01-01
  • 2019-10-07
  • 2022-06-22
  • 2020-08-16
  • 2020-03-29
相关资源
最近更新 更多