我有一些使用nhibernate查询数据库的C#代码,如下所示:
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的一个特定问题
答案 0 :(得分:7)
您可以使用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()
方法添加条件。
答案 1 :(得分:0)
如果你看起来像这样:
public IList<Bestellung> GetAll(Expression<Func<Order, bool>> restriction)
{
ISession session = SessionService.GetSession();
IList<Order> bestellungen = session.Query<Order>()
.Where(restriction).ToList();
return bestellungen;
}
阅读this。