在实体框架中使用枚举的条款

时间:2011-11-15 22:44:12

标签: linq entity-framework enums lambda

所以这就是我的枚举。真的很基本。枚举没有相应的数据库表。相反,只要类具有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值hooray。我的问题是当我尝试编写使用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.

所以我尝试编写这个Value扩展方法,但我意识到只允许我在比较的右侧取出MyEnum引用,因为我不能将该函数实际放在lambda表达式中。怎么办?

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

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

刚刚开始施放:

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