Entity framework core EF Core计算属性生成低效查询

Entity framework core EF Core计算属性生成低效查询,entity-framework-core,Entity Framework Core,我有一个类,它有两个字段 public bool IsX { get;set; } public bool IsY { get; set; } public bool IsZ => IsX || IsY; 我不必每次都记得查询实体是X或Y,而是想添加一个帮助器来为我这样做(假设X和Y实际上是Z的子集) 但当我运行这个程序并查看为IsZ处的计数生成的SQL时,它将选择所有属性和所有记录,然后似乎在内存中进行计数。如果我在IsX或IsY处进行计数,它将只进行计数(*),并应用正确的whe

我有一个类,它有两个字段

public bool IsX { get;set; }

public bool IsY { get; set; }

public bool IsZ => IsX || IsY;
我不必每次都记得查询实体是X或Y,而是想添加一个帮助器来为我这样做(假设X和Y实际上是Z的子集)

但当我运行这个程序并查看为IsZ处的计数生成的SQL时,它将选择所有属性和所有记录,然后似乎在内存中进行计数。如果我在IsX或IsY处进行计数,它将只进行计数(*),并应用正确的where子句

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


有没有办法做到这一点,或者我应该将其更改为一个更普通的属性,以某种方式将其自身设置?

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服务器上处理