如何从多个LoadOperations进行查询

时间:2011-07-20 18:24:25

标签: c# silverlight ria

我试图通过WCF RIA服务使用LINQ将两个查询合并在一起。

每次我尝试查询从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;

我做过几十次搜索,我知道它与List绑定到GridView之前没有加载的数据有关,但是我不知道如何使用两个LoadOperations作为其中一部分来解决这个问题。查询。

谢谢,

盖瑞特

1 个答案:

答案 0 :(得分:1)

您正在设置异步加载,但没有响应加载完成事件,也没有使用加载操作对象的实体成员(lo和c2000lo)。

您无法在数据来自服务器之前查询数据。在您的示例中,您必须等待两个加载操作完成才能加入lo.Entities和c2000lo.Entities的结果。然而,这是一个糟糕的方式......

简化此操作的常用方法是在服务器上进行连接和提取,并返回适当数据类型的IEnumerable,以获得所需的实际结果。使用Silverlight,您始终希望最大限度地减少传输到客户端的数据量。

您可以在加载完成之前执行加载操作(如lo)并绑定到其Entities成员,因为Entities只是一个容器,会在数据时通知绑定加载如:

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