LINQ to Entities中的Enum.HasFlag?

Stu*_*ser 10 c# linq lambda linq-to-entities c#-4.0

我有一面旗帜,例如

[Flags]
public enum DaysOfTheWeek
{
    Monday = 1,
    Tuesday = 2,
    Wednesday = 4,
    Thursday = 8,
    Friday = 16,
    Saturday = 32,
    Sunday = 64
}
Run Code Online (Sandbox Code Playgroud)

如果我想使用Linq基于包含特定标志的变量进行过滤,我可以尝试在lambda语句中使用Enum.HasFlag来过滤多个标志,例如

DaysOfWeek weekendFilter = DaysOfTheWeek.Saturday | DaysOfTheWeek.Sunday;
var weekends = allDays.Where(d => d.DayOfWeek.HasFlag(weekendFilter));
Run Code Online (Sandbox Code Playgroud)

这目前给出:

LINQ to Entities无法识别方法'Boolean HasFlag(System.Enum)'方法,并且此方法无法转换为存储表达式.

usr*_*usr 20

枚举标志基于二进制操作.

HasFlag = (allDays & (DaysOfTheWeek.Saturday | DaysOfTheWeek.Sunday)) != 0;
Run Code Online (Sandbox Code Playgroud)

如果您愿意,可以将其抽象为扩展方法.

具体地回答你的问题:

DaysOfWeek weekendFilter = DaysOfTheWeek.Saturday | DaysOfTheWeek.Sunday;
var weekends = allDays.Where(d => (d.DayOfWeek & weekendFilter) != 0);
Run Code Online (Sandbox Code Playgroud)

我知道你可以在LINQ to SQL中使用这个谓词.它将被翻译为SQL(SQL Server支持二进制算术就好了).不确定EF是否同样有能力,因为它的LINQ支持通常远远低于L2S.


Shi*_*mmy 6

看起来它已在 EF 6.1 中修复。

但是,关于 EF Core,请检查