我有一堂课,有几个字段
public bool IsX { get;set; }
public bool IsY { get; set; }
public bool IsZ => IsX || IsY;
我不必每次都要记住查询该实体是X还是Y,而是想添加一个可以帮我完成该任务的助手(假设X和Y确实是Z的子集。
但是当我运行它并查看生成的SQL时IsZ的计数。它将选择所有属性和所有记录,然后似乎在内存中进行计数。好像我在计算IsX或IsY的位置一样,它将简单地计数(*)并应用正确的where子句。
我不确定这需要什么配置,或者如何设置它以便很好地查询数据库。如果可以避免的话,我宁愿不将其添加到数据库中(对于DB而言,它实际上具有我正在设置的字段似乎更干净)。
是否有办法做到这一点,还是应该将其更改为更普通的属性,以某种方式将其自身设置?
答案 0 :(得分:0)
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服务器上处理。