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的第一部分,但这不能解决它.
任何帮助深表感谢.
简单地说,只要您告诉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)