相关疑难解决方法(0)

将谓词<T>转换为表达式<Func <T,bool >>

有可能以Predicate<T> to Expression<Func<T, bool>>某种方式转换?

我想使用我的ICollectionView的过滤器使用下一个IQueryable函数:

public static System.Linq.IQueryable<TSource> Where<TSource>(this System.Linq.IQueryable<TSource> source, System.Linq.Expressions.Expression<System.Func<TSource, bool>> predicate)
Run Code Online (Sandbox Code Playgroud)

谢谢

c# expression predicate iqueryable icollectionview

7
推荐指数
2
解决办法
5475
查看次数

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

我有一些C#代码使用nhibernate查询数据库,如下所示:

      public void Query()
      {

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

我现在有许多用户驱动程序过滤器,因此,根据传入的参数,我想添加到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()
      }
Run Code Online (Sandbox Code Playgroud)

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

         p.Name == name
Run Code Online (Sandbox Code Playgroud)

但其他人可能更复杂,如:

         p.ProjectApplications.Select(r => r.Application).Any(s => applicationIds.Contains(s.Id)))
Run Code Online (Sandbox Code Playgroud)

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

更新:

我在其他情况下看到,人们建议建立where子句

query …
Run Code Online (Sandbox Code Playgroud)

c# nhibernate lambda filter where-clause

1
推荐指数
1
解决办法
4631
查看次数