2015-07-10 72 views
1

我有一个操作,它需要一个可序列化的QueryModel并将其转换为要传递给实体框架的Expression。我对数据库查询的样子:被忽略的实体框架动态查询表达式

public IEnumerable<PhotoVerifySessionOverview> FindSessions(Expression<Func<vwPhotoVerifySession, bool>> predicate, PaginationModel model) 
    { 

     var sessions = Context.vwPhotoVerifySessions 
      .AsQueryable() 
      .Where(predicate) 
      .OrderBy(string.Format("{0} {1}", model.OrderByColumn, model.OrderByDirection)) 
      .Skip(model.Offset) 
      .Take(model.PageSize); 

     return Mapper.Map<IEnumerable<PhotoVerifySessionOverview>>(sessions); 
    } 

和我的谓词建设者的样子:

 var predicate = PredicateBuilder.True<vwPhotoVerifySession>(); 

     //Add the tenant to the where clause 
     if (model.TenantId.HasValue) 
      predicate.And(p => p.TenantId == model.TenantId.Value); 
     else 
      predicate.And(p => p.TenantReferenceId == model.TenantReferenceId); 

     //Add a date range if one is present 
     if (model.CreatedOnRange != default(DateRange)) 
     { 
      var endDate = model.CreatedOnRange.End == default(DateTime) ? DateTime.Now : model.CreatedOnRange.End; 

      predicate.And(p => p.CreatedOn >= model.CreatedOnRange.Start && p.CreatedOn <= endDate); 
     } 

     //Include status filtering if any filters are present 
     if (model.StatusFilter != null && model.StatusFilter.Any()) 
     { 
      //use Id and name to search for status 
      predicate.And(p => model.StatusFilter.Any(f => f.StatusId == p.StatusId || p.Status == f.Name)); 
     } 

     var pagination = model as PaginationModel; 

     var sessions = Manager.FindSessions(predicate, pagination); 

     return sessions; 

的问题是,我的WHERE子句不正在评估,并正在返回的所有结果。有什么我应该做的,以获得Where语句正常工作?

回答

1

您需要将predicate指定回给自己。

predicate = predicate.And(p => p.TenantId == model.TenantId.Value);