Использование Enums в Entity Framework, где пункт - PullRequest
2 голосов
/ 16 ноября 2011

Итак, вот что у меня есть для моего перечисления.Действительно простой.Перечисление НЕ имеет соответствующей таблицы базы данных.Скорее, когда у класса есть свойство 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.

Поэтому я попытался написать этот метод расширения Value, но понял, что это позволит мне только вынутьссылка MyEnum в правой части сравнения, поскольку я не могу поместить функцию на самом деле в лямбда-выражение.Что делать?

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

Ответы [ 2 ]

4 голосов
/ 16 ноября 2011

Это не поддерживается до следующей основной версии EF (.NET 4.5). До .NET 4.5 вы должны передавать int своим запросам (преобразование должно выполняться вне вашего запроса). Лучший обходной путь - это .

2 голосов
/ 16 ноября 2011

Просто сотворите для начала:

   public List<MyClass> FindAllOfEnum(MyEnum myEnum) 
   { 
      using (DbContext db = new DbContext()) 
      { 
         return db.MyClasses.Where(x => x.MyEnum == (int)myEnum); 
       } 
   } 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...