C# Expression.Call、Int32和Enum

C# Expression.Call、Int32和Enum,c#,fluent-nhibernate,expression,kendo-grid,C#,Fluent Nhibernate,Expression,Kendo Grid,无法理解如何构建一个比较枚举类型和int的表达式。我有一个嵌入了剑道组件的MVC站点。在view类中,属性是枚举,但视图返回Int32(源是Kendo IFilterDescriptor) 所以问题是…:我从视图中收到一个int,构建表达式,但由于需要一个enum,所以失败了。通过将int转换为其enum表示来修复此问题,但在查询数据库时失败,因为数据库需要Int32 public static Expression<Func<DOMAIN, bool>> Get

无法理解如何构建一个比较枚举类型和int的表达式。我有一个嵌入了剑道组件的MVC站点。在view类中,属性是枚举,但视图返回Int32(源是Kendo IFilterDescriptor)

所以问题是…:我从视图中收到一个int,构建表达式,但由于需要一个enum,所以失败了。通过将int转换为其enum表示来修复此问题,但在查询数据库时失败,因为数据库需要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?),要么是告诉类型(在item.Member中)是int而不是enum,但我不知道这是如何或是否正确。 谢谢

更新更新

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

至于表达式部分,我已经通过向属性添加一个属性来修复了这个问题,该属性告诉应该如何转换值。我没有使用Expression.Convert(但我可以),转换在生成表达式之前在收到的筛选器描述中进行


谢谢你的时间和帮助。我将接受与Expression.Convert相关的答案,因为它可以解决问题。我仍然想理解Expression.Call()方法,所以请随意评论。谢谢。

我没有看到您要比较的枚举,是item.Value吗

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

enum Blah
{
    Tom,
    Rick,
    Harry
}

if ((Int32)Blah.Tom == 0)
{
}

我看不到您要比较的枚举,是item.Value吗

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

enum Blah
{
    Tom,
    Rick,
    Harry
}

if ((Int32)Blah.Tom == 0)
{
}

可以使用
Expression.Convert
将枚举
类型的表达式转换为
int`(假设枚举的基础类型是int)。

可以使用
Expression.Convert
将枚举
类型的表达式转换为
int`(假设枚举的基础类型是int).

这难道不起作用吗

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

这难道不管用吗

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

item.Member包含属性的名称并通过它查找其类型。item.Member包含属性的名称并通过它查找其类型。我看到了表达式。Call I有点像IEqualityComparer-它使我能够(以某种方式)进行自己的比较-错了吗?我看到了这个表达。我有点像IEqualityComparer-它让我能够(不知何故)进行自己的比较-错了吗?