首页 > 解决方案 > 如何确定 EF 核心中的自定义服务器评估?

问题描述

我有这个实体

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-frameworkdomain-driven-designef-core-3.1

解决方案


我看到两种可能的解决方法:

  1. 介绍计算列并为其提供sql。
  2. 制作表达式树
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,具有基于表达式的计算列表达式方法支持。


推荐阅读