Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ中的Enum.HasFlag是否指向实体?_C#_Linq_C# 4.0_Lambda_Linq To Entities - Fatal编程技术网

C# LINQ中的Enum.HasFlag是否指向实体?

C# LINQ中的Enum.HasFlag是否指向实体?,c#,linq,c#-4.0,lambda,linq-to-entities,C#,Linq,C# 4.0,Lambda,Linq To Entities,我有一面旗帜 [Flags] public enum DaysOfTheWeek { Monday = 1, Tuesday = 2, Wednesday = 4, Thursday = 8, Friday = 16, Saturday = 32, Sunday = 64 } DaysOfWeek weekendFilter = DaysOfTheWeek.Saturday | DaysOfTheWeek.Sunday; var week

我有一面旗帜

[Flags]
public enum DaysOfTheWeek
{
    Monday = 1,
    Tuesday = 2,
    Wednesday = 4,
    Thursday = 8,
    Friday = 16,
    Saturday = 32,
    Sunday = 64
}
DaysOfWeek weekendFilter = DaysOfTheWeek.Saturday | DaysOfTheWeek.Sunday;
var weekends = allDays.Where(d => d.DayOfWeek.HasFlag(weekendFilter));
如果我想使用Linq根据包含特定标志的变量进行过滤,我可以尝试在lambda语句中使用Linq来过滤多个标志,例如

[Flags]
public enum DaysOfTheWeek
{
    Monday = 1,
    Tuesday = 2,
    Wednesday = 4,
    Thursday = 8,
    Friday = 16,
    Saturday = 32,
    Sunday = 64
}
DaysOfWeek weekendFilter = DaysOfTheWeek.Saturday | DaysOfTheWeek.Sunday;
var weekends = allDays.Where(d => d.DayOfWeek.HasFlag(weekendFilter));
这目前提供:

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


枚举标志基于二进制操作

HasFlag = (allDays & (DaysOfTheWeek.Saturday | DaysOfTheWeek.Sunday)) != 0;
如果愿意,可以将其抽象为扩展方法

具体回答你的问题:

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

我知道可以将此谓词与LINQ to SQL一起使用。它将被转换为SQL(SQL Server完全支持二进制算法)。不确定EF是否具有同等能力,因为其LINQ支持通常远不如L2S。

解决方案是@usr的答案和对我使用的EntityFramework版本的理解的结合。EF4不支持保存枚举,所以实体保存int?并且对象上枚举的属性未映射到EF。枚举的属性将映射到其get/set的成员

e、 g

根据@usr的回答,过滤器需要使用二进制操作完成。这可以通过将标志设置为扩展字节来实现

[Flags]
public enum DaysOfTheWeek : byte
{
    Monday = 1,
    Tuesday = 2,
    Wednesday = 4,
    Thursday = 8,
    Friday = 16,
    Saturday = 32,
    Sunday = 64
}
然后将值和筛选器转换为字节以执行二进制操作:

var weekends = allDays.Where(d => (((byte)d.DayOfWeekValue.Value) & (byte)weekendFilter) != 0);
它已在EF 6.1中固定


但是,关于EF核心,请检查。

我不太明白您所说的二进制操作到底是什么意思。我知道它会将数字调低到字节,并根据数字比较位,但无法在我需要如何更新lambda的问题上做出精神上的飞跃。我如何为
周末
工作更新lambda?当然。我编辑了我的答案。因为您使用的是EF,所以无法在函数中抽象出操作,因为这不会转换为SQL。@Shimmy我不知道。测试它并在EF项目上打开GitHub问题。他们需要一些东西来跟踪此功能请求。从EF6.1开始,LINQ to Entities支持HasFlag。见:和