我试图查找是否有任何电影即将开始,因此检查
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; }
}
添加了电影实体
我想这不会解决错误,但存在逻辑问题;由于 before 小于 after,rx.MovieStart <= before && rx.MovieStart >= after 将始终为 false(任何值都不能小于 -15 且 大于 10)。
SingleOrDefault(至少在 vanilla linq 中)在有多个结果时会抛出异常,因此这也应该更改。