2013-06-06 2 views
2

Я пытаюсь создать динамический запрос йота условие на emumEF динамический запрос с перечислением

enumField & enumValue == enumValue 

для этого, при анализе называется

Expression GenerateBitWiseAnd(Expression left, Expression right) { 
    return Expression.And(left, right); 
} 

это бросает следующее исключение

And binary operator is not defined for `EnumType` and `EnumType`. 

оператор равенства хорошо работает

Expression GenerateEqual(Expression left, Expression right) { 
    return Expression.Equal(left, right); 
} 

Но я не могу понять, как обращаться с [Флаги] без оператора бит А.

Вопрос: отсюда, как динамически подделать мой запрос, чтобы проверить мое перечисление.

Мое приложение ориентирована на .Net 4

+0

Вы пробовали определения и оператор самостоятельно, HTTP : //msdn.microsoft.com/en-us/library/aa288467 (v = vs.71) .aspx –

+0

@AntarrByrd Нет, но я думаю и думаю, что если я это сделаю, запрос linq не будет переведенный на SQL с помощью EF. – tschmit007

+0

Эй! Я сейчас столкнулся с такой же проблемой, что хочу проверить флаги перечислимого типа в динамическом запросе linq. вы придумали решение, как сделать эту работу еще? – Staeff

ответ

1

Вам нужно преобразовать Enum его базового типа, прежде чем вы можете работать на нем:

Expression GenerateBitWiseAnd(Expression left, Expression right) 
{ 
    if (left.Type.IsEnum) 
    { 
     var enumType = left.Type; 
     var compareType = Enum.GetUnderlyingType(enumType); 
     var enumField = Expression.Convert(left, compareType); 
     var enumValue = Expression.Convert(right, compareType); 
     var and = Expression.And(enumField, enumValue); 
     return Expression.Convert(and, enumType); 
    } 

    return Expression.And(left, right); 
} 
+0

больше нет ошибок, прямо сейчас я не могу проверить sql, потому что мой профилировщик не работает ... но, похоже, это ... большой мокрый привкус! – tschmit007

+0

Я проверяю sql, это просто отлично, спасибо вам снова – tschmit007

Смежные вопросы