Как сделать запрос из нескольких LoadOperations - PullRequest
0 голосов
/ 20 июля 2011

Я пытаюсь объединить два запроса, используя LINQ через службы WCF RIA.

Каждый раз, когда я пытаюсь запросить два списка, созданных из LoadOperation, я никогда не получаю никаких результатов.

Вот мой код:

        LoadOperation<BTSLead_vw> lo = bictx.Load<BTSLead_vw>(bictx.GetBTSAttendedQuery().Take(2000));
        List<BTSLead_vw> btsattended = lo.Entities.ToList<BTSLead_vw>();
        LoadOperation<SyStudentApps> c2000lo = c2000ctx.Load<SyStudentApps>(c2000ctx.GetSyStudentAppsQuery().Take(2000));
        List<SyStudentApps> c2000apps = c2000lo.Entities.ToList<SyStudentApps>();

        var query = from bts in btsattended
                    join apps in c2000apps on bts.SystemLeadID equals apps.SyStudentID
                    select new BTSMasterQuery
                    {
                        SyStudentID = apps.SyStudentID,
                        EventDate = (DateTime)bts.EventDate,
                        StartTime = (DateTime)bts.StartTime,
                        SchoolStatus = apps.SchoolStatus,
                        LeadCat = apps.LeadCat,
                        StuNum = apps.StuNum,
                        AppRecDate = Convert.ToDateTime("11/01/2001")/*(from enroll in c2000ctx.GetAdEnrollsQuery()
                                      where enroll.SyStudentID == apps.SyStudentID
                                      select enroll.AppRecDate).First()*/,
                        TourAttended = (
                                      bts.InterestTitle == "Recording Arts Converted Group" ? "Recording Arts" :
                                      bts.InterestTitle == "Digital Arts Converted Group" ? "Digital Arts and Design" :
                                      bts.InterestTitle == "Unclear Converted Group" ? "Unknown" :
                                      bts.InterestTitle == "Film and Video Converted Group" ? "Film and Video" :
                                      bts.InterestTitle == "Show Production Converted Group" ? "Show Production" :
                                      bts.InterestTitle == "Gaming Converted Group" ? "Gaming" :
                                      bts.InterestTitle == "Entertainment Business Converted Group" ? "Entertainment Business" : bts.InterestTitle),
                        Gender = apps.Gender,
                        Ethnicity = apps.Ethnicity
                    };
        this.radGridView1.ItemsSource = query;

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

Спасибо

Garrett

1 Ответ

1 голос
/ 21 июля 2011

Вы настраиваете асинхронные нагрузки, но не реагируете на события завершения загрузки и не используете члены Entities ваших объектов операции загрузки (lo и c2000lo).

Вы не можете запросить данные, прежде чем они поступят с сервера. В вашем примере вам нужно будет дождаться завершения двух операций загрузки, прежде чем объединять результаты lo.Entities и c2000lo.Entities. Однако это плохой способ сделать это ...

Обычный способ упростить это - выполнить объединение и извлечение на сервере и вернуть IEnumerable соответствующего типа данных только для тех результатов, которые вам нужны. С Silverlight вы всегда хотите минимизировать объем данных, передаваемых клиенту.

Вы можете выполнить операцию загрузки (например, lo) и связать ее с элементом Entities до завершения загрузки, поскольку Entities - это просто контейнер, который будет уведомлять привязку, когда данные загружены, как:

    LoadOperation<Customer> loadOp = this._customerContext.Load(this._customerContext.GetCustomersQuery());
    CustomerGrid.ItemsSource = loadOp.Entities;
...