【问题标题】:How to determine custom server evaluation in EF core?如何确定 EF 核心中的自定义服务器评估?
【发布时间】:2020-09-15 15:15:59
【问题描述】:
我有这个实体
public class Foo
{
public int Id{get; private set;}
public DateTime CreatedOn {get; private set;}
public bool IsActive {get; private set;}
public bool CanBeDisplayed => IsActive && CreatedOn > DateTime.Now.AddYear(-1);
}
我希望这个dbcontext.Foos.Where(f=>f.CanBeDisplayed).ToArray(); 可以在sql server 端进行评估。可能在 DBContext 类中有一个属性或一些绑定可以给我一个工作。
我的目标是拥有一个丰富的模型,兼容 ef 核心,我错过了什么吗?
【问题讨论】:
标签:
c#
entity-framework
domain-driven-design
ef-core-3.1
【解决方案1】:
我看到了两种可能的解决方法:
- 介绍Computed Column并为其提供sql。
- 制作表达式树
public class Foo
{
public int Id { get; private set; }
public DateTime CreatedOn { get; private set; }
public bool IsActive { get; private set; }
// mark ignored for EF?
public bool CanBeDisplayed => _compiled(this);
private static Func<Foo, bool> _compiled = CanBeDisplayedExp.Compile();
public static Expression<Func<Foo, bool>> CanBeDisplayedExp = f => f.IsActive && f.CreatedOn > DateTime.Now.AddYears(-1);
}
使用仅限于dbcontext.Foos.Where(Foo.CanBeDisplayedExp).ToArray()
也不确定 EF 是否可以翻译 DateTime.Now.AddYears。
附言
仅供参考 Linq2Db 有 expression based calculated colums 和 Expression Methods 支持。