c# - 在 C# 的 nhibernate 查询中动态添加到 where 子句的最佳方法是什么?

标签 c# nhibernate filter lambda where-clause

我有一些 C# 代码使用 nhibernate 查询数据库,如下所示:

      public void Query()
      {

        IEnumerable<Project> list = session.Query<Project>()
            .Where(p => !p.IsDeleted)
            .FetchMany(r => r.UnfilteredProjectApplications)
            .ThenFetch(r => r.Application)
            .ToList()
      }

我现在有许多用户驱动程序过滤器,因此,根据传入的参数,我想添加到 where 子句中。所以像这样:

       public void Query(string name)
      {

         if (!String.IsNullOrEmpty(name)
          {
            IEnumerable<Project> list = session.Query<Project>()
             .Where(p => !p.IsDeleted && p.Name == name)
            .FetchMany(r => r.UnfilteredProjectApplications)
            .ThenFetch(r => r.Application)
            .ToList()
          }
      }
      else
      {
        IEnumerable<Project> list = session.Query<Project>()
            .Where(p => !p.IsDeleted)
            .FetchMany(r => r.UnfilteredProjectApplications)
            .ThenFetch(r => r.Application)
            .ToList()
      }

用户可以选择一个或多个过滤器。正如您可以想象的那样,考虑到大量的组合,上面的代码会变得非常复杂。有没有一种优雅的方法可以在此处附加一个带有附加逻辑 block 的 where 子句。有些可能很简单,例如

         p.Name == name

但其他的可能更复杂,例如:

         p.ProjectApplications.Select(r => r.Application).Any(s => applicationIds.Contains(s.Id)))

正如我所说,可能有零个或多个不同的过滤器。 .

更新:

我在其他情况下看到,人们建议构建像

这样的 where 子句
query = query.where (r=>r.name = "XYZ");
query = query.where (r=>r.Age > 10);
query = query.where (r=>r.Gender = "Male");

但这似乎不适用于 nhibernate,所以开始时是一个通用的 lambda 问题现在是 nhibernate 的特定问题

最佳答案

您可以使用 PredicateBuilder<T> 创建表达式并将其应用于您的查询,例如:

public void Query(string name)
{
    Expression<Func<Project, bool>> filter = PredicateBuilder.True<Project>();

    filter = filter.And(p => !p.IsDeleted);

    if (!string.IsNullOrEmpty(name)
        filter = filter.And(p => p.Name == name);

    IEnumerable<Project> list = session.Query<Project>()
                                        .Where(filter)
                                        .FetchMany(r => r.UnfilteredProjectApplications)
                                        .ThenFetch(r => r.Application)
                                        .ToList();
}

使用 PredicateBuilder,您可以创建所需的表达式,使用 And() 添加条件, Or() , Not()方法。

关于c# - 在 C# 的 nhibernate 查询中动态添加到 where 子句的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22944722/

相关文章:

MySQL 从包含不同数据类型的列中过滤某些值

NHibernate:没有主键的多对一

休眠延迟加载

javascript - JQuery - 使用不同输入的多个过滤器过滤数据属性

java - AutoCompleteTextView - 禁用过滤

.net - SetFetchMode 调用被忽略

c# - ASP.NET Core MVC View 组件搜索路径

c# - 在 C# 中将十进制数组转换为字节数组,反之亦然

c# - IService 扩展 IRepository 是否正确?

c# - 使用 DataTable.js 在 asp.net gridview 中使用下拉列表进行列式过滤器