entity-framework-core - 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 子句。
我不确定这需要什么配置,或者如何设置它以便很好地查询数据库。如果可以避免的话,我宁愿不将该列添加到数据库中(对于数据库来说,只有我实际设置的字段似乎更干净)。
有没有办法做到这一点,或者我应该把它改成一个更正常的属性,以某种方式设置它自己?
解决方案
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 服务器上处理。
推荐阅读
- java - Android - 从 ListView 上单击的项目传递值并将它们显示在新的 Activity 上
- mysql - RDS MySQL Storage Full ...当数据库使用率低时
- asp.net - 如何检查arraylist是否已经包含一个对象
- windows - 如何减小 Windows 中 Qt 创建的安装文件夹的大小
- azure - ML Studio中Web Service API的主键是否过期?
- arduino - 如何仅在存在或不存在 RFID 卡时执行一次代码
- c# - 从 JSON 对象列表中获取每个对象的特定值
- python - 平方误差是否取决于隐藏层的数量?
- c - 我可以分叉进程并执行内部函数吗?
- python-3.x - Numpy,Python3.6 - 无法理解为什么地址不同?