代码之家  ›  专栏  ›  技术社区  ›  Sisiutl

在实体框架Where子句中使用标志

  •  3
  • Sisiutl  · 技术社区  · 16 年前

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

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

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

    无法创建“Closure type”类型的常量值。在此上下文中仅支持基元类型('如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 回复  |  直到 16 年前
        1
  •  5
  •   Yakimych    16 年前

    我猜你用的是旧的EF3.5。VS2010中的EF4.0没有问题。但是,3.5版本有一个问题,您必须使用解决方法。投出 categories 变量到 int 在查询之前,然后使用 内景

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