NH QueryOver扩展:如何将成员表达式合并到另一个表达式中?

问题描述

| 我正在尝试为DateTime的限制创建扩展方法?属性。它用于搜索查询,我真的不想在所有可能的日期字段中重复此代码。
public static IQueryOver<T,T> WhereInOpenEndedDateRange<T>(this IQueryOver<T,T> query,Expression<Func<object>> field,DateTime? rangeFrom,DateTime? rangeTo)
{
    if(rangeFrom.HasValue && rangeTo.HasValue)
    {
        query.WhereRestrictionOn(field).IsBetween(rangeFrom.Value).And(rangeTo.Value);
    }
    else if (rangeFrom.HasValue)
    {
        //query.Where(() => /* help */ >= rangeFrom.Value);
    }
    else if (rangeTo.HasValue)
    {
        //query.Where(() => /* help */ <= rangeTo.Value);
    }

    return query;
}
我认为我缺少表达的基本方面。是否可以通过某种形式的Expression参数并将其用于
/* help */
点? 谢谢 更新 越来越近了,但仍然感觉很遥远...
else if (rangeFrom.HasValue)
{
    var lt = Expression.LessThanOrEqual(field,Expression.Constant(rangeFrom,typeof(DateTime?)));
    var b = Expression.Lambda<Func<bool>>(lt);
    query.Where(b);
}
但这不起作用,因为它会将comparing3ѭ与
DateTime?
进行比较。如何将原始属性表达式合并为新的ѭ5,并保留所需的位以使NH QueryOver保持原样? 在查看QueryOverRestrictionBuilder的NH源之后,我将做
string propertyName = ExpressionProcessor.FindMemberExpression(field.Body)
并建立“使用条件限制”方法。     

解决方法

好吧,我无法弄清楚如何使用
Expression<Func<bool>> 
签名,但无论如何这仅适用于DateTime,因此我看不到添加的限制有什么不同。 基本上,您需要表达式(示例中的字段)完全匹配您要发送的参数,即x => x.SomeNullableDateField。 \'x \'是您开始使用的查询类型
session.QueryOver<YourClass>()
因此它需要包含在发送的表达式类型中。您还错过了使用
ParameterExpression param = expression.Parameters.Single() 
用于构造比较表达式。 您本打算将BinaryExpression转换为
Expression<Func<bool>>
,但必须将其进一步提高到
Expression<Func<T,bool>>
public static IQueryOver<T,T> WhereInOpenEndedDateRange<T>(this IQueryOver<T,T> query,Expression<Func<T,DateTime?>> expression,DateTime? rangeFrom,DateTime? rangeTo) where T : class
{
    // Lambda being sent in
    ParameterExpression param = expression.Parameters.Single();

    if(rangeFrom.HasValue && rangeTo.HasValue)
    {
        // GT Comparison
        var expressionGT =
            Expression.GreaterThanOrEqual(
                expression.Body,Expression.Constant(rangeFrom.Value,typeof(DateTime?)
            )
        );

        // LT Comparison
        var expressionLT =
            Expression.LessThanOrEqual(
                expression.Body,Expression.Constant(rangeTo.Value,typeof(DateTime?)
            )
        );

        query.Where(
               Expression.Lambda<Func<T,bool>>(expressionGT,param))
               .And(
               Expression.Lambda<Func<T,bool>>(expressionLT,param)
        );
    }
    else if(rangeFrom.HasValue)
    {
        // GT Comparison
        BinaryExpression expressionGT =
            Expression.GreaterThanOrEqual(
                expression.Body,typeof(DateTime?)
            )
        );

        // covert to lambda
        query.Where(Expression.Lambda<Func<T,param));
    }
    else if(rangeTo.HasValue)
    {
        // LT Comparison
        BinaryExpression expressionLT =
            Expression.LessThanOrEqual(
                expression.Body,typeof(DateTime?)
            )
        );

        query.Where(Expression.Lambda<Func<T,param));
    }

    return query;

}
用法
var test = session.QueryOver<MyPocoClass>()
            .WhereInOpenEndedDateRange(x=>x.SomeNullableDateField,DateTime.Now,null);
    

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...