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.