首页 > 解决方案 > EF Core 计算属性产生低效查询

问题描述

我有一门有几个领域的课程

public bool IsX { get;set; }

public bool IsY { get; set; }

public bool IsZ => IsX || IsY;

不必记住每次都查询实体是 X 还是 Y,我想添加可以为我做这件事的助手(假设 X 和 Y 实际上是 Z 的子集。

但是当我运行它并查看生成的 SQL 时,IsZ. 它将选择所有属性和所有记录,然后似乎在内存中进行计数。就好像我在 IsX OR IsY 中进行计数一样,它将简单地计数(*)并应用正确的 where 子句。

我不确定这需要什么配置,或者如何设置它以便很好地查询数据库。如果可以避免的话,我宁愿不将该列添加到数据库中(对于数据库来说,只有我实际设置的字段似乎更干净)。

有没有办法做到这一点,或者我应该把它改成一个更正常的属性,以某种方式设置它自己?

标签: entity-framework-core

解决方案


EF 需要一个表达式树,以便将谓词转换为可以在数据库服务器上执行的内容。这可能不像您的问题那样干净,但是您的问题的解决方案可能如下所示:

public static class MyDatabaseObjectHelpers
{
    public static Expression<Func<MyDatabaseObject, bool>> IsZ = d => d.IsX || d.IsY;
}

然后,您的数据库查询将如下所示:

var zCount = context.MyDatabaseObjects.Where(IsZ).Count();

由于 IsZ 是一个表达式,翻译器将能够识别出所有条件都可以在 db 服务器上处理。


推荐阅读