我有一个[国旗]枚举是这样的:如何在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