我有一個[國旗]枚舉是這樣的:如何在Linq中將標誌枚舉用於實體查詢?
[Flags]
public enum Status
{
None = 0,
Active = 1,
Inactive = 2,
Unknown = 4
}
A狀態枚舉可以包含兩個值,如:
Status s = Status.Active | Status.Unknown;
現在我需要創建一個LINQ查詢(LINQ到ADO.NET實體)並要求記錄的狀態是以上,即活動或未知;
var result = from r in db.Records
select r
where (r.Status & (byte)s) == r.Status
當然,我得到一個錯誤,因爲LINQ to Entities只知道處理Where子句中的基本類型。
錯誤是:
無法創建 類型「閉合類型」的恆定值。在此上下文中僅支持原始 類型(如Int32,String和 Guid)。
有沒有可行的方法?我可能有一個狀態枚舉有10個可能的值,並查詢5個狀態。如何以優雅的方式使用Flags枚舉構造查詢?
謝謝。
更新
這似乎是一個LINQ到實體問題。我認爲在LINQ to SQL中起作用(不確定,沒有測試過)。
你查詢(如果它的工作)只會返回狀態是同時'活動'*和*'未知'的記錄。那是你要的嗎? – LukeH 2009-09-15 11:40:07
不,這是一個或不是一個。所以'Status s = Status.Active | Status.Unknown;」是正確的。謝謝! – 2009-09-15 11:42:30
@Vasi:該部分是正確的,但「Status.Active | Status.Unknown'」相當於「'1 | 4'」,它是'5'。因此,你的'where'子句有效地說「where(r.Status&5)== r.Status'」,這與「r.Status == 5'相同」,這與說(英文)「,其中'r.Status'既是'Active' *又是'Unknown'」! – LukeH 2009-09-15 11:50:06