2011-04-08 3 views
0
private void OnSearchExecute(IQueryable<SurveySearchCriteria> query) 
    { 
     SurveySearchCriteria ssc=query.Where(a => a.CriteriaString == "LastName").SingleOrDefault(); 

     string format = ssc.WhereClause; 
     string args= string.Format(".{0}(\"{1}\")", SelectedSearchType, EnteredSearchCriteria); 

     string returnval = string.Format(format, args);   




     ReadmissionTrackingApplication.Server.Services.SurveysDomainContext _context = 
           new ReadmissionTrackingApplication.Server.Services.SurveysDomainContext(); 

     EntityQuery<ReadmitPatientList> eq = _context.GetReadmitPatientListByCriteriaQuery(returnval); 

     var lo= _context.Load<ReadmitPatientList>(eq); 

이 코드를 사용하면 내 lo.entities가 채워지지 않습니다. 콜백을 사용하지 않기 때문에 느낌이 들지만 linqpad에서는 쿼리가 제대로 작동합니다.linq 동적 쿼리가 채우기를 채우지 않습니다.

returnval = "PatientLastName.Contains (\"test \ ")"그리고 linqpad에 연결하면 작동합니다.

ReadmitPatientList.AsQueryable().

public IQueryable<Data.ReadmitPatientList> GetReadmitPatientListByCriteria(string formattedCriteriaString) 
     { 
      var query = this.ObjectContext.ReadmitPatientList.AsQueryable() 
          .Where(a => a.OriginalAdmitDate >= new DateTime(2010, 01, 01)) 
          .Where(formattedCriteriaString); 

      return query; 

     } 

내 질문은 왜이 어디 ("PatientLastName.Contains (\"테스트 \ ")") 여기

가 domainservice 쿼리는 ...입니다 linqpad에서 작동하지만 내 코드에서는 작동하지 않습니다. Silverlight를 사용하고 있으므로 콜백이 필요하지 않을 수 있습니다. 이것은 webbasede 프로그래밍에 대한 나의 첫 번째 중요한 진출이다. 그래서 나는 여전히 모든 복잡함에 익숙해 져있다. ...

+0

예외 사항? – Slauma

답변

0

이것은 콜백 문제였다. 필자는 코드를 리팩터링하여 콜백 기능을 구현하고 Domainservice 호출을 정리하여 작동합니다.

고객 서비스 :

public void getReadmitPatientList(System.Action<ICollection<ReadmitPatientList>> callback, string searchCriteria) 
     { 
      var q = _context.GetReadmitPatientListByCriteriaQuery(searchCriteria); 
      _context.Load<ReadmitPatientList>(q, OnReamitPatientListLoaded, callback); 
     } 

     public void getReadmitPatientList(System.Action<ICollection<ReadmitPatientList>> callback, int days) 
     { 
      DateTime CurrentDate = DateTime.Today; 

      DateTime entryDate = CurrentDate.AddDays(-days); 

      var q = _context.GetReadmitPatientListQuery().Where(a => a.OriginalAdmitDate >= entryDate); 
      _context.Load<ReadmitPatientList>(q, OnReamitPatientListLoaded, callback); 

     } 

     public void OnReamitPatientListLoaded(LoadOperation<ReadmitPatientList> lo) 
     { 
      if (!lo.HasError) 
      { 
       ICollection<ReadmitPatientList> q = new ObservableCollection<ReadmitPatientList>(lo.Entities); 
       var action = (Action<ICollection<ReadmitPatientList>>)lo.UserState; 
       action.Invoke(q); 
      } 
      else 
      { 
       MessageBox.Show(string.Format("{1}{0}{2}", Environment.NewLine, lo.Error.Message, lo.Error.InnerException)); 

       lo.MarkErrorAsHandled(); 
      } 
     } 

도메인 서비스 :

public IQueryable<Data.ReadmitPatientList> GetReadmitPatientListByCriteria(string formattedCriteriaString) 
    { 
     var query = this.ObjectContext.ReadmitPatientList.AsQueryable() 
         .Where(a => a.OriginalAdmitDate >= new DateTime(2010, 01, 01)) 
         .Where(formattedCriteriaString); 

     return query; 

    }