簡體   English   中英

LINQ to Entities中的Enum.HasFlag?

[英]Enum.HasFlag in LINQ to Entities?

我有一面旗幟,例如

[Flags]
public enum DaysOfTheWeek
{
    Monday = 1,
    Tuesday = 2,
    Wednesday = 4,
    Thursday = 8,
    Friday = 16,
    Saturday = 32,
    Sunday = 64
}

如果我想使用Linq基於包含特定標志的變量進行過濾,我可以嘗試在lambda語句中使用Enum.HasFlag來過濾多個標志,例如

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。

看起來它已在EF 6.1中修復。

但是關於EF Core,請檢查一下

該解決方案結合了@ usr的答案,以及對我正在使用的EntityFramework版本的理解。 EF4不支持保存枚舉,所以實體保存了一個int? 並且對象上枚舉的屬性未映射到EF。 枚舉的屬性將映射到成員的get / set。

例如

public int? DayOfWeekValue { get; set; }
[NotMapped]
public DaysOfWeek DayOfWeek
{
    get { return (DaysOfWeek)DayOfWeekValue; }
    set { DayOfWeekValue= (int)value; }
}

因為,根據@ 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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM