如何将Enum转换为Int以用于Expression.Equals操作?

Lee*_*e D 10 c# expression-trees linq-to-sql

我试图在C#中动态构建表达式树,它被编译并用作LINQ-to-SQL Where()调用的谓词.问题是我试图将一个Enum(使用int作为其底层类型)直接与Int进行比较,但这是失败的错误"成员MyEnumType没有支持的SQL转换".

码:

ParameterExpression param = Expression.Parameter(typeof(MyClass), "obj"); //input parameter - this exposes a property of the Enum type
MemberExpression enumMember = Expression.Property(param, "MyEnumProperty"); //used to get the Enum typed property from the parameter

//MISSING STEP TO CAST THE ENUM OF THE MEMBER EXPRESSION TO AN INT?

BinaryExpression binaryExpr = Expression.Equal(enumMember, Expression.Constant(1));
LambdaExpression<Func<MyClass, bool>> whereClause = Expression.Lambda(binaryExpr, param);

//when whereClause is used to filter LINQ-to-SQL results, the error is thrown
Run Code Online (Sandbox Code Playgroud)

我对表达树很新,我无法弄明白.我试过用

Expression.Convert(enumMember, typeof(int))
Run Code Online (Sandbox Code Playgroud)

作为BinaryExpression的第一部分,但这不能解决它.

任何帮助深表感谢.

Mar*_*ell 6

简单地说,只要您告诉LINQ-to-SQL关于枚举(而不是将其映射为C#int中的单独属性进行转换),您就不应该这样做.例如,以下工作正常:

var param = Expression.Parameter(typeof(DomainObject));
var body = Expression.Equal(Expression.Property(param, "SomeProperty"),
                         Expression.Constant(YourEnumType.SomeEnum));
var predicate = Expression.Lambda<Func<DomainObject, bool>>(body, param);
var count = db.Table.Where(predicate).Count();
Run Code Online (Sandbox Code Playgroud)

重点是我的SomeProperty属性在dbml中映射到枚举.只需使用枚举类型(包括命名空间)改写类型名称.

同样,你不应该给它1,而是键入的枚举; 例如:

Expression.Constant(Enum.ToObject(typeof(YourEnumType), 1))
Run Code Online (Sandbox Code Playgroud)

(如果你知道的话1)