在Entity Framework Where子句中使用标志

时间:2010-07-09 20:03:41

标签: entity-framework

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

[Flags]
public enum RuleCategories
{
    None = 0x0000,
    ApplicantBased = 0x0001,
    LocationBased = 0x0002,
    PolicyBased = 0x0004,
    PropertyBased = 0x0008
}

当我尝试使用LINQ to Entities

检索对象时
var allRules = from r in context.Rules
               where  ((r.CategoryEnum & (int)categories) != 0)
               select r;

我收到此错误:

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

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

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

我得到了一个不同的错误:

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

如何根据标志选择实体?

由于

1 个答案:

答案 0 :(得分: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;