在 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 的一个特定问题
您可以使用
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;
}
阅读此内容。