c# - 在 C# 中为 Nhibernate QueryOver 动态构建联合

标签 c# nhibernate queryover nhibernate-criteria

我正在尝试为我的收藏构建一些过滤器生成器。

public static NHibernate.Criterion.Conjunction CreateConjunction<T>(this IEnumerable<FilterDescriptor> _filters)
        {
            NHibernate.Criterion.Conjunction conjunction = new NHibernate.Criterion.Conjunction();

            foreach (var filter in _filters)
            {
                PropertyInfo propertyInfoObj = typeof(T).GetProperty(filter.Member);
                conjunction.Add<T>(x => propertyInfoObj.GetValue(x, null) == filter.Value);
            }

            return conjunction;
        }

我当然可以在调用行连接时说。Add 抛出错误“从范围”引用的“Foo”类型的变量“x”,但它未定义 nhibernate queryOver。

如何构建可以被 queryOver.Where() 接受的连词或表达式?

我正在寻找向我的 QueryOver 添加过滤的相当通用的解决方案,有什么建议吗?

最佳答案

我确实使用 criterion ald 构建简单的表达式四处走动,看起来都是这样的:

public static void AddFilterCriteria<T>(this NHibernate.IQueryOver<T,T> _this, IEnumerable<Filter> _filters)
{
    foreach (var filter in _filters)
    {
        _this.And(GetCriterion(filter));
    }
}

public static NHibernate.Criterion.ICriterion GetCriterion(Filter _filter)
{
    if (_filter.Value is string)
    {
        return GetCriterionForString(_filter);
    }

    switch (_filter.Operator)
    {
        case eFilterOperator.IsEqualTo:
            {
                return NHibernate.Criterion.Expression.Eq(_filter.Member, _filter.Value);
            }
        case eFilterOperator.IsNotEqualTo:
            {
                return NHibernate.Criterion.Expression.Not(NHibernate.Criterion.Expression.Eq(_filter.Member, _filter.Value));
            }
        case eFilterOperator.IsGreaterThan:
            {
                return NHibernate.Criterion.Expression.Gt(_filter.Member, _filter.Value);
            }
        case eFilterOperator.IsGreaterThanOrEqualTo:
            {
                return NHibernate.Criterion.Expression.Ge(_filter.Member, _filter.Value);
            }
        case eFilterOperator.IsLessThan:
            {
                return NHibernate.Criterion.Expression.Lt(_filter.Member, _filter.Value);
            }
        case eFilterOperator.IsLessThanOrEqualTo:
            {
                return NHibernate.Criterion.Expression.Le(_filter.Member, _filter.Value);
            }
        default:
            throw new InvalidOperationException();
    }
}

字符串条件构建有一些特殊的逻辑,但它与其余部分类似且非常简单。 您可以构建连词、析取并将它们作为 ICriteria 返回,例如:

case eFilterOperator.Contains:
                    {
                        NHibernate.Criterion.Conjunction conjunction = new NHibernate.Criterion.Conjunction();
                        conjunction.Add(NHibernate.Criterion.Expression.IsNotNull(_filter.Member)); 
                        conjunction.Add(NHibernate.Criterion.Expression.InsensitiveLike(_filter.Member, _filter.Value.ToString(), NHibernate.Criterion.MatchMode.Anywhere));
                        return conjunction;
                    }

一切正常,我不需要在应用过滤器之前从数据库中读取整个数据,这是我的目标。

PS Filter.Member 是字符串 Filter.Value 是对象 运算符是枚举

关于c# - 在 C# 中为 Nhibernate QueryOver 动态构建联合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34608050/

相关文章:

nhibernate - NHibernate IUserType将可为空的DateTime转换为DB非空值

c# - Nhibernate QueryOver 左外连接条件

NHibernate 3. QueryOver 中 "ThenFetch"的替代方案

c# - 进度条不工作

c# - 如何构建 DataContractJsonSerializer 便捷函数

c# - 从抽象类对象列表访问子类的属性

Nhibernate 组件映射 : Parent Object null in Value Object while querying from database

nhibernate - 使用 Criteria API 使用 NHibernate 删除集合

c# - 在我的代码中隐藏继承成员警告消息! - 不知道它来自哪里

c# - NHibernate 多个带有 in 子句的子查询