.net NHibernate Linq lambda表达式链接

.net NHibernate Linq lambda表达式链接,nhibernate,.net-4.0,lambda,expression-trees,linq-to-nhibernate,Nhibernate,.net 4.0,Lambda,Expression Trees,Linq To Nhibernate,我正在尝试创建一个方法,该方法创建where谓词,以便稍后在linqwhere方法(Linq2NHibernate)上使用。 我这里有一个方法,它执行将在查询Linq中使用的表达式的创建。 让我们看一些代码 private Expression<Func<Model.FattureEmesse, bool>> getUserFilterExpression(FattureFilter filterStructure) { Expression<Func<M

我正在尝试创建一个方法,该方法创建where谓词,以便稍后在linqwhere方法(Linq2NHibernate)上使用。 我这里有一个方法,它执行将在查询Linq中使用的表达式的创建。 让我们看一些代码

private Expression<Func<Model.FattureEmesse, bool>> getUserFilterExpression(FattureFilter filterStructure)
{
  Expression<Func<Model.FattureEmesse, bool>> dataDocumentoFilter = f =>
     true;

  Expression<Func<Model.FattureEmesse, bool>> dataFineValiditaFilter = f =>
     true;

  var userFilterExpression = dataDocumentoFilter
     .And(dataFineValiditaFilter)
     .And(dataImportazioneFilter);

  return userFilterExpression;            
}
私有表达式getUserFilterExpression(FattureFilter filterStructure)
{
表达式dataDocumentoFilter=f=>
是的;
表达式dataFineValiditaFilter=f=>
是的;
var userfiltereexpression=dataDocumentoFilter
.和(dataFineValiditaFilter)
.和(数据导入过滤器);
返回userFilterExpression;
}
表达式将比简单的“始终为真”更复杂,但对于问题,我得到了相同的行为。 你看,这是一个扩展方法(我在这里找到了真正的扩展方法)

内部静态类谓词扩展
{
公共静态表达式和(此表达式表达式表达式1,表达式表达式表达式2),其中T:Model.DomainModelObject
{
InvocationExpression invokedExpression=Expression.Invoke(expression2,expression1.Parameters.Cast());
返回Expression.Lambda(Expression.And(expression1.Body,invokedExpression),expression1.Parameters);
}
}
现在我有了一个业务逻辑类,该类带有一个方法,该方法收集创建的表达式并将其传递给DAL管理器。 该方法只调用

var userFilterExpression = getUserFilterExpression(filterStructure);
var securityFilterExpression = new BL.SecurityManager().getFilterExpression<Model.FattureEmesse>(user);
var totalFilterExpression = userFilterExpression.And(securityFilterExpression);
var userfiltereexpression=getuserfiltereexpression(filterStructure);
var securityFilterExpression=new BL.SecurityManager().getFilterExpression(用户);
var totalFilterExpression=userFilterExpression.And(securityFilterExpression);
如您所见,我从Securitymanager检索了另一个表达式(如果您怀疑,即使我避免将2表达式链接在一起,问题也会出现) 然后打电话

var filteredFatture = new GenericDalManager().getFilteredList<Model.FattureEmesse>(maximumRows, startRowIndex, totalFilterExpression);
var filteredFatture=new GenericDalManager().getFilteredList(maximumRows、startRowIndex、totalFilterExpression);
在这里,所有东西都放在一起进行查询

public class GenericDalManager
{
   internal IList<T> getFilteredList<T>(int maximumRows, int startRowIndex, Expression<Func<T, bool>> expressionResult) where T : Model.DomainModelObject
   {   
      using (var session = PersistenceManager.Istance.GetSession())
      {
         var items = (from o in session.Linq<T>()
                      orderby o.Id
                      select o);

         var filteredItems = items.Where(expressionResult)
                                  .Skip(startRowIndex)
                                  .Take(maximumRows);                    

         return filteredItems.ToList();
      }  
   }
}
公共类GenericDalManager
{
内部IList getFilteredList(int maximumRows、int startRowIndex、Expression expressionResult),其中T:Model.DomainModelObject
{   
使用(var session=PersistenceManager.Istance.GetSession())
{
var items=(来自session.Linq()中的o)
订单号
选择o);
var filteredItems=items.Where(expressionResult)
.Skip(startRowIndex)
.取(最大行数);
返回filteredItems.ToList();
}  
}
}
因此,当我调用执行查询的方法时,它会在最后一行中看到的.ToList()调用中返回一个错误。 错误是 对象引用未设置为对象的实例。 它出现在NHibernate.Linq中。 这个问题似乎与And扩展方法有关,因为如果我制作一个简单的表达式,而没有任何链接,它就会工作。 发生了什么? 如果我只是在将表达式传递给genericDalManager.getFilteredList方法之前编译该表达式,那么一切都可以运行,但它不会将表达式作为数据库上的查询进行计算(显然,“always true”表达式不会生成任何有趣的where子句,但我需要它来执行更复杂的筛选)。 奇怪的是,如果我不在getUserFiltreExpression方法中链接两个“always true”表达式,但只返回第一个表达式,那么一切都正常。即使在相同的表达式之后,也将与BL.SecurityManager().getFilterExpression(用户)调用的结果链接。 顺便说一句,为了测试这个问题,最后一个调用返回另一个“always true”表达式


请任何人帮忙。。。我快发疯了

我想问题在于,您和的是表达式的结果(在调用之后),而不是表达式本身。该表达式可能无法解析。您可能还需要添加and(逻辑and)和and(按位and),并可能重新绑定参数

public class GenericDalManager
{
   internal IList<T> getFilteredList<T>(int maximumRows, int startRowIndex, Expression<Func<T, bool>> expressionResult) where T : Model.DomainModelObject
   {   
      using (var session = PersistenceManager.Istance.GetSession())
      {
         var items = (from o in session.Linq<T>()
                      orderby o.Id
                      select o);

         var filteredItems = items.Where(expressionResult)
                                  .Skip(startRowIndex)
                                  .Take(maximumRows);                    

         return filteredItems.ToList();
      }  
   }
}