比较时间时LINQ表达式无法翻译

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

我试图查找是否有任何电影即将开始,因此检查

before
,或者它已经开始,因此检查
after
。 我使用 DateTimeOffset 来跟踪时间,因为我使用的是 Postgres。

这是我的查询,查找是否有任何电影,我期望在某个时间播放一部电影,如果没有,那么它应该返回 null。

var now = DateTimeOffset.Now;
var before = now.AddMinutes(-15);
var after = now.AddMinutes(10);
var movie = await _context.Movies.SingleOrDefaultAsync(rx => 
    rx.LanguageId == request.LanguageId
    && rx.MovieStart <= before 
    && rx.MovieStart >= after);

但是我得到了如下所示的错误,我怀疑这部分条款:

&& rx.MovieStart <= before && rx.MovieStart >= after

LINQ 表达式 'DbSet() .Where(s => s.LanguageId == __request_LanguageId_0 && s.MovieStart <= __before_1 && s.MovieStart >= __after_2)' 无法翻译。以可翻译的形式重写查询,或者通过插入对“AsEnumerable”、“AsAsyncEnumerable”、“ToList”或“ToListAsync”的调用来显式切换到客户端评估。

这是电影实体:

public class Movie
{
  public string Id { get; set; }
  public string Title { get; set; }
  public string? Description { get; set; }
  public DateTimeOffset MovieStart { get; set; }
  public DateTimeOffset MovieEnd { get; set; }
  public string? LanguageId { get; set; }
}

编辑#1:

添加了电影实体

c# linq entity-framework-core npgsql .net-7.0
1个回答
0
投票

我想这不会解决错误,但存在逻辑问题;由于 before 小于 after,rx.MovieStart <= before && rx.MovieStart >= after 将始终为 false(任何值都不能小于 -15 大于 10)。

SingleOrDefault(至少在 vanilla linq 中)在有多个结果时会抛出异常,因此这也应该更改。

© www.soinside.com 2019 - 2024. All rights reserved.