在C#中的nhibernate查询中动态添加where子句的最佳方法是什么? [英] What is the best way to dynamically add to a where clause in a nhibernate query in C#?

查看:165
本文介绍了在C#中的nhibernate查询中动态添加where子句的最佳方法是什么?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

  public void Query()返回一个数据库查询数据库, 
{

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

我现在有一些用户驱动程序过滤器,所以根据传入的参数,我想添加到where子句。所以这样的事情:

pre $ $ $


$ public $ (!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()
}



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


$ b

用户可以选择一个或多个过滤器,可以想象,由于大量的组合,上面的代码会变得非常复杂秒。有没有一个优雅的方式来附加一个where子句在这里附加的逻辑块。有些可能很简单,比如

  p.Name == name 

但是其他的可能会更复杂一些:

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

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

UPDATE:



我在其他情况下看到, p>

  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()方法。


I have a some C# code that is querying a database using nhibernate that looks like this:

      public void Query()
      {

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

I now have a number of user driver filters so, based on the parameters passed in, i want to add to the where clause. So something like this:

       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()
      }

the user can select one or many filters. As you can imagine, this code above would get ridiculously complicated given the large number of combinations. Is there an elegant way to append a where clause here with additional blocks of logic. Some might be simple such as

         p.Name == name

but others might be more complicated like:

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

and as I said, there may be zero or many different filters . .

UPDATE:

i have seen in other cases, people suggesting building up the where clause like

query = query.where (r=>r.name = "XYZ");
query = query.where (r=>r.Age > 10);
query = query.where (r=>r.Gender = "Male");

but that does NOT seem to work with nhibernate so what started was a generic lambda question is now a specific question to nhibernate

解决方案

You can use the PredicateBuilder<T> to create the expression and apply it on your query, for sample:

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();
}

With PredicateBuilder you can create the expression you need, adding conditions using And(), Or(), Not() methods.

这篇关于在C#中的nhibernate查询中动态添加where子句的最佳方法是什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆