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

本文关键字:子句 where 最佳 是什么 方法 查询 动态 添加 nhibernate | 更新日期: 2023-09-27 17:57:21

我有一些 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()
      }

用户可以选择一个或多个筛选器。 可以想象,考虑到大量的组合,上面的代码会变得非常复杂。 有没有一种优雅的方法可以在此处附加带有其他逻辑块的 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 的一个特定问题

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

您可以使用

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() 方法添加条件。

如果你看起来像这样:

public IList<Bestellung> GetAll(Expression<Func<Order, bool>> restriction)
{
    ISession session = SessionService.GetSession();
    IList<Order> bestellungen = session.Query<Order>()
                    .Where(restriction).ToList();
    return bestellungen;
}

阅读此内容。