计算的只读成员作为计算列
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) ....;
我有以下 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) ....;