【问题标题】:Using Enums in Entity Framework Where Clause在实体框架 Where 子句中使用枚举
【发布时间】:2011-11-15 22:44:12
【问题描述】:

这就是我的枚举。真的很基础。枚举没有对应的数据库表。相反,只要一个类具有 MyEnum 属性,数据库就有一个 int 列。一切正常。

public enum MyEnum : int
{
    Zero = 0,
    One = 1,
    Two = 2
}

这是我的类,它在数据库中有自己的表。

public class MyClass
{
    public long MyClassID { get; set; }
    public MyEnum { get; set; }
}

所以当我去拉出一个 MyClass 对象时,MyEnum 属性被设置为它对应的 int 值,万岁。我的问题是,当我尝试编写使用 MyEnum 属性的查询时,出现错误。

public List<MyClass> FindAllOfEnum(MyEnum myEnum)
{
    using (DbContext db = new DbContext())
    {
        return db.MyClasses.Where(x => x.MyEnum == myEnum);
    }
}

// ERROR:
// The specified type member 'MyEnum' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.

所以我尝试编写这个值扩展方法,但我意识到这只会让我取出比较右侧的 MyEnum 引用,因为我不能将函数实际放入 lambda 表达式中。做什么?

public static class Extensions
{
    public static int Value(this MyEnum myEnum)
    {
        return (int)myEnum;
    }
}

【问题讨论】:

  • 发帖前请使用搜索工具。有很多问题在问这个问题。
  • 那么请随时提供一个链接以及您的讽刺评论。

标签: linq entity-framework enums lambda


【解决方案1】:

在 EF 的下一个主要版本 (.NET 4.5) 之前不支持。在 .NET 4.5 之前,您必须将 int 传递给您的查询(转换必须在您的查询之外完成)。最好的解决方法是this。

【讨论】:

    【解决方案2】:

    刚开始投射:

       public List<MyClass> FindAllOfEnum(MyEnum myEnum) 
       { 
          using (DbContext db = new DbContext()) 
          { 
             return db.MyClasses.Where(x => x.MyEnum == (int)myEnum); 
           } 
       } 
    

    【讨论】:

    • 不,这将导致我得到相同的错误:LINQ to Entities 不支持指定的类型成员“MyEnum”。仅支持初始化程序、实体成员和实体导航属性。编辑:实际上,我得到“Operator '=='
    • 编辑:实际上,我得到“运算符'=='不能应用于'MyEnum'和'int'类型的操作数”。如果我使用 Object.Equals,则会出现上述错误。
    • 对,我打算与实际列进行比较:return db.MyClasses.Where(x => x.mycolumn == (int)myEnum);
    • 好的,谢谢。这就是我现在所拥有的,我希望我不必公开暴露整数值,唉。
    • 好兄弟 :)
    猜你喜欢
    • 2011-12-31
    • 1970-01-01
    • 2019-10-13
    • 2010-11-08
    • 2011-05-11
    • 1970-01-01
    • 1970-01-01
    • 2010-12-04
    • 1970-01-01
    相关资源
    最近更新 更多