在Entity Framework Where子句中使用标志

Sis*_*utl 3 entity-framework

我有一个类(由我的数据库中的EF构建),它有一个标志字段.该字段作为名为CategoryEnum的列中的int存储在数据库中.我有一个枚举,指定标志的允许值:

[Flags]
public enum RuleCategories
{
    None = 0x0000,
    ApplicantBased = 0x0001,
    LocationBased = 0x0002,
    PolicyBased = 0x0004,
    PropertyBased = 0x0008
}
Run Code Online (Sandbox Code Playgroud)

当我尝试使用LINQ to Entities检索对象时

var allRules = from r in context.Rules
               where  ((r.CategoryEnum & (int)categories) != 0)
               select r;
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

无法创建"闭包类型"类型的常量值.在此上下文中仅支持原始类型(例如Int32,String和Guid').

或者,如果我尝试将实体值转换为枚举

var allRules = from r in context.Rules
               where (((RuleCategories)r.CategoryEnum & categories) != 0)
               select r;
Run Code Online (Sandbox Code Playgroud)

我得到一个不同的错误:

无法将类型'System.Int32'强制转换为类型RuleCategories'.LINQ to Entities仅支持转换实体数据模型基元类型.

如何根据标志选择实体?

谢谢

Yak*_*ych 5

我猜想你说你使用的是旧的EF 3.5.这在VS2010中的EF 4.0没有问题.但是,3.5版本存在问题,您必须使用变通方法.将categories变量强制转换int为查询之前,然后int在查询本身内使用您的变量:

int preCastCategories = (int)categories;
var allRules = from r in context.Rules
               where  ((r.CategoryEnum & preCastCategories) != 0)
               select r;
Run Code Online (Sandbox Code Playgroud)