【问题标题】:DayOfWeek in LINQ queryLINQ 查询中的 DayOfWeek
【发布时间】:2020-08-21 13:59:21
【问题描述】:

我有一个代表星期几的简单整数列表。我正在尝试检查我的实体的 Date 属性是否在选定的星期几内。但是如果我尝试在这样的目标数据库的查询中传递它:

query.Where(e => selectedDaysOfWeek.Contains((int)e.Date.DayOfWeek));

我遇到了异常:

无法翻译 LINQ 表达式...。以可翻译的形式重写查询,或通过插入对 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync() 的调用显式切换到客户端评估。

另一方面,如果我首先通过调用 ToList() (例如)执行查询,然后在结果列表中添加相同的 where 条件,它可以工作:

var items = query.ToList();
items = items.Where(e => selectedDaysOfWeek.Contains((int)e.Date.DayOfWeek)).ToList();

虽然在我的情况下这是可以接受的,但我想从数据库中获取更少的项目。有没有办法在查询 db 时检查 DayOfWeek 是我最初的意图?

【问题讨论】:

标签: linq entity-framework-core ef-core-3.1


【解决方案1】:

您正在从查询中的DateTime 引用访问DayOfWeek 属性。

实体框架“不知道”如何将其转换为 SQL,因此在您收到异常的第一段代码中。

在第二部分中,它在您通过.ToList() 调用从数据库中获取所有数据后开始工作,并且.Where 过滤正在内存中进行。

如果您希望在数据库端实现该逻辑,则必须编写自己的 SQL 语句。

【讨论】:

  • 我知道第一段代码有什么问题,我只是想知道是否有某种方法可以“欺骗”它以某种方式比较 DayOfWeek...
  • this thread 中有一些讨论可能会有所帮助,至于如果需要获取日期名称,可以使用 Enum.GetName(typeof(T), value) 方法。这可能会有所帮助。
猜你喜欢
  • 2021-03-05
  • 1970-01-01
  • 2012-02-06
  • 2013-05-15
  • 1970-01-01
  • 2010-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多