我正在尝试在 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
我对表达式树相当陌生,我无法理解这一点。我试过使用
Expression.Convert(enumMember, typeof(int))
作为 BinaryExpression 的第一部分,但这并不能解决问题。
非常感谢任何帮助。
最佳答案
简单地说,您不必这样做,只要您已将枚举告知 LINQ-to-SQL(而不是将其映射为 int
并拥有一个单独的 C# 中进行翻译的属性)。例如,以下工作正常:
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();
要点是我的 SomeProperty
属性在 dbml 中映射到枚举。只需使用枚举类型(包括命名空间)改写类型名称即可。
同样,您不应该给它一个 1,而应该给它一个类型化的枚举;例如:
Expression.Constant(Enum.ToObject(typeof(YourEnumType), 1))
(如果你只知道1
)
关于c# - 如何将 Enum 转换为 Int 以用于 Expression.Equals 操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3635102/