Использование флага в предложении Entity Framework Where - PullRequest
3 голосов
/ 10 июля 2010

У меня есть класс (созданный EF из моей базы данных), который имеет поле, являющееся флагом. Поле хранится в базе данных как int в столбце с именем CategoryEnum. У меня есть перечисление, которое определяет допустимые значения флага:

[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 поддерживает только приведение типов примитивов Entity Data Model.

Как выбрать объекты на основе флага?

Спасибо

1 Ответ

5 голосов
/ 10 июля 2010

Я собираюсь угадать и сказать, что вы используете старый добрый EF 3.5.Это работает без проблем с EF 4.0 в VS2010.Однако существует проблема с версией 3.5, и вам придется использовать обходной путь.Приведите переменную categories к int перед запросом, а затем используйте переменную int внутри самого запроса:

int preCastCategories = (int)categories;
var allRules = from r in context.Rules
               where  ((r.CategoryEnum & preCastCategories) != 0)
               select r;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...