Expression.Call, Int32 and Enum

本文关键字:and Enum Int32 Call Expression | 更新日期: 2024-11-07 15:25:05

无法弄清楚如何构建将枚举类型与整数进行比较的表达式。我有一个嵌入了剑道组件的 MVC 站点。在视图类中,属性是 ENUM,但视图返回 Int32(源是 Kendo IFilterDescriptor)。

所以问题是...:我从视图中收到一个int,构建表达式,但由于需要枚举而失败。通过将 int 转换为其枚举表示形式来解决此问题,但在查询数据库时会失败,因为数据库需要 Int32。

    public static Expression<Func<DOMAIN, bool>> GetExpressionsFromFilterDescription<DOMAIN, VIEW>(this IEnumerable<IFilterDescriptor> _this)
    {
        Expression expressions = null;
        ParameterExpression pe = Expression.Parameter(typeof(DOMAIN), "x");
        foreach (FilterDescriptor item in _this)
        {
            MemberExpression member = Expression.Property(pe, item.Member);
            ConstantExpression value = Expression.Constant(item.Value);
            Expression exp = null;
            switch (item.Operator)
            {
                case FilterOperator.IsEqualTo:
                    exp = Expression.Equal(member, value);

据我了解,Expression.Call() 应该能够解决这个问题,我只是不知道该怎么做。

任何帮助将不胜感激。

彼得·

更新

像下面这样转换值确实解决了表达式问题("没有为类型定义二进制运算符 Equal..."error),但随后我在查询数据库时收到一个新错误:"NHibernate.Criterion.SimpleExpression 中的类型不匹配:状态预期类型 System.Int32,实际类型..."。

exp = Expression.Equal(member, Expression.Convert(value, typeof(MyEnum)));

在我看来,修复是通过构建我自己的比较(Expression.Call ?)或通过告诉类型(在项目中。成员)是一个整数而不是枚举,但我不知道如何或这是否是正确的方式。谢谢。

更新

更新

问题的第二部分似乎是由于NHibernate.QueryOver及其局限性造成的。一旦更改为NHibernate.Linq,问题的查询部分就消失了。

至于表达式部分,我已经通过在属性中添加一个属性来解决问题,该属性告诉应该如何转换值。我没有使用 Expression.Convert(但我可以),转换发生在构建表达式之前收到的过滤器描述中。

感谢您的时间和帮助。我将接受与Expression.Convert相关的答案,因为它可以解决问题。我仍然想了解 Expression.Call() 方法 - 所以请随时对此发表评论。谢谢。

Expression.Call, Int32 and Enum

这难道不行吗?

MemberExpression member = Expression.Convert(
                            Expression.Property(pe, item.Member), typeof(int);
ConstantExpression value = Expression.Constant((int)item.Value);
您可以使用

Expression.Convert将枚举的表达式转换为 int type to an"(假设枚举的基础类型是 int)。

我没有完全看到您正在比较的枚举,是项目吗?价值?

您始终可以将枚举的值转换为数字,以将其与数字进行比较,或将其馈送到无法识别枚举的系统中:

enum Blah
{
    Tom,
    Rick,
    Harry
}
if ((Int32)Blah.Tom == 0)
{
}