Entity framework core 在.Net 5.0.4实体框架查询中对多个值使用[Flags]
我有一个带有[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]
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现在可以正常工作了…:-)