带枚举的EF动态查询

时间:2013-06-06 14:37:49

标签: linq entity-framework linq-to-entities

我正在尝试使用emum

建立一个动态查询条件
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);
}

但我无法想象如何在没有And bits运算符的情况下处理[Flags]。

问题是:从这里开始如何动态伪造我的查询来检查我的枚举。

我的应用程序的目标是.Net 4

1 个答案:

答案 0 :(得分: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);
}