динамический запрос linq не заполняет коллекцию - PullRequest
0 голосов
/ 09 апреля 2011
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.

returnval = "PatientLastName.Contains (\" test \ ")", и когда я подключаю его к linqpad, он работает.

ReadmitPatientList.AsQueryable (). Где ( "PatientLastName.Contains (\" тест \ ")")

вот запрос службы домена ...

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;

        }

Мой вопрос: почему это работает в linqpad, а не в моем коде? Я использую Silverlight, так что это может быть из-за отсутствия обратного вызова. Это мой первый крупный опыт в программировании веб-баз, поэтому я все еще привыкаю ко всем тонкостям ...

1 Ответ

0 голосов
/ 12 апреля 2011

Это была проблема с обратным вызовом.Я реорганизовал свой код, чтобы он реализовал функцию обратного вызова и очистил вызовы службы домена, и теперь он работает.

СЕРВИС КЛИЕНТА:

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;

    }
...