计算的只读成员作为计算列

Calculated readonly Member as Calculated Column

我有以下 class 并希望能够使用这样的 Linq 查询来查询它 dbContext.Example.Where(e=> e.IsBetween);

public class Example {
  public DateTime Start {get; set;}
  public DateTime End {get; set;}
  public bool IsBetween => DateTime.Now >= Start && DateTime.Now <= End ;
}

然而,这会导致运行时出现“无法翻译 LINQ 表达式 [...]。重写 [...] 或切换到客户端评估”错误。

我有什么办法可以 link 只读 属性 IsBetween 到数据库中的 CalculatedColumn?

该错误表明 EF 无法将您的自定义方法 (属性 getter) 转换为 SQL。如果您 have/want 将 IsBetween 映射到数据库中的计算列,您应该这样做 accordingly。像这样(还没有检查 SQL 的有效性):

public class Example {
  public DateTime Start {get; set;}
  public DateTime End {get; set;}
  public bool IsBetween {get; set;} ;
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    // your setup ...
    modelBuilder.Entity<Example>()
        .Property(p => p.IsBetween)
        .HasComputedColumnSql("getdate() >= Start AND getdate() <= END");
}

如果您希望 IsBetween 仅存在于代码中,您将需要使用 expression trees,或者示例:

public class Example {
  public DateTime Start {get; set;}
  public DateTime End {get; set;}
  public bool IsBetween => _func(this) ; 
  public static readonly Expression<Func<Example, bool>> IsBetweenExpr = e => 
      DateTime.Now >= e.Start && DateTime.Now <= e.End;
  private static readonly Func<Example, bool> _func = _expr.Compile();
}

dbContext.Example.Where(Example.IsBetweenExpr) ....;