Entity framework core 在.Net 5.0.4实体框架查询中对多个值使用[Flags]

Entity framework core 在.Net 5.0.4实体框架查询中对多个值使用[Flags],entity-framework-core,.net-5,enum-flags,Entity Framework Core,.net 5,Enum Flags,我有一个带有[Flags]属性的枚举,如下所示: [Flags] public enum FlagStatus { Value1 = 1 , Value2 = 2 , Value3 = 4 } x => x.Status.HasFlag(flagStatus) @__request_Status_0 = 5 WHERE ([o].[StatusId] & @__request_Status_0) = @__re

我有一个带有[Flags]属性的枚举,如下所示:

[Flags]

public enum FlagStatus
    
{
    
    Value1 = 1
    
  , Value2 = 2
    
  , Value3 = 4
    
}
x => x.Status.HasFlag(flagStatus)
@__request_Status_0 = 5
WHERE ([o].[StatusId] & @__request_Status_0) = @__request_Status_0)
我对EF的查询如下:

[Flags]

public enum FlagStatus
    
{
    
    Value1 = 1
    
  , Value2 = 2
    
  , Value3 = 4
    
}
x => x.Status.HasFlag(flagStatus)
@__request_Status_0 = 5
WHERE ([o].[StatusId] & @__request_Status_0) = @__request_Status_0)
现在,如果我设置
flagStatus=flagStatus.Value1
,查询工作正常,因为我将值设置为1)

但是如果我将其设置为
flagStatus=flagStatus.Value1 | flagStatus.Value3
,则查询不会返回任何结果,因为转换后的SQL如下所示:

[Flags]

public enum FlagStatus
    
{
    
    Value1 = 1
    
  , Value2 = 2
    
  , Value3 = 4
    
}
x => x.Status.HasFlag(flagStatus)
@__request_Status_0 = 5
WHERE ([o].[StatusId] & @__request_Status_0) = @__request_Status_0)
由于该Id在Status字段中无效,因此不会返回任何结果

所以现在的问题是:是不是.Net5 EF应该支持.HasFlag,还是出于某种原因将按位操作限制为一个值?如果是这样的话,为什么要支持位操作呢

我可能错过了什么,但我就是看不到

.Net5 EF不支持.HasFlag

支持意味着转换为SQL,而不是引发运行时异常,显然是这样

由于某种原因,位运算是否仅限于一个值

不,不是。但当与多个值一起使用时,它的含义与您似乎期望的不同。CLR方法的文档说明它返回

true
如果在标志中设置的位字段或位字段也在当前实例中设置;否则,
false

然后在评论中:

方法返回以下布尔表达式的结果

thisInstance和flag=flag

这正是EF Core所做的

将其转换为简单的字,它检查标志中的所有位是否都存在于值中(集合的等效
ALL
操作)。虽然您似乎期望它具有
任何
语义

简而言之,
HasFlag
用于
All
。对于任何
,都没有专用的方法,因此您应该使用它的直接位运算等价物,即

(value & flags) != 0
在你的样品中

x => (x.Status & flagStatus) != 0

非常感谢你澄清这一点。看到它被指出,这是很有道理的。我翻译的SQL现在可以正常工作了…:-)