我有一些 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/