2015-07-10 42 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);