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

标签 c# linq-to-sql expression-trees

我正在尝试在 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/

相关文章:

c# - 从派生类获取特定类型

C#:LINQ to SQL:执行文字查询

.net - 选择数据访问技术时要考虑的问题?

c# - 表达式树中的简单 Where 子句

c# - 使用选择器的表达式树条件转换

c# - 为什么类可以有明确的无参数构造函数而结构不能?

c# - 多继承无多重继承无代码重复

c# - Windows 窗体在闪屏后落后

mysql - 优化查询或建议 LINQ 等价物

c# - ExpressionTree 否定字符串操作