[英]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。
該解決方案結合了@ 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.