2014-10-26 23 views
-1

我正在从RIA服务中获取大量数据。返回类型有一组对象,如RouteA,HistroyRouteA。 HistroyLogRouteA都具有相同唯一密钥的不同年份的记录。隐藏收集字典对象的对象<string,object>

我必须将这些数据动态绑定到RadGridView。总是我有未知的列结果。 为此,我跟着

http://blogs.telerik.com/vladimirenchev/posts/11-09-28/dynamic-binding-for-your-silverlight-applications.aspx

http://www.telerik.com/forums/rowdetailstemplate-binding-with-dynamic-data

,及代码建立我的数据收集:

private void OnShowPreviousYear(object parameter) 
    { 
     GridViewHeaderCell cell = parameter as GridViewHeaderCell; 
     var head = cell.Column.Header; 
     this.context.Load<Route>(this.context.GetRoutesQuery(), LoadBehavior.MergeIntoCurrent, OnRouteHistoryLoadComplete, null); 
    } 

    private void OnRouteHistoryLoadComplete(LoadOperation<Route> lo) 
    { 
     object ro = null; 
     if (lo.Entities != null) 
     { 

      this.context.Load<Routeshistory>(this.context.GetRouteshistoriesQuery(), LoadBehavior.MergeIntoCurrent, (lp) => 
      { 
       Route recent = lo.Entities.FirstOrDefault(); 
       int year =(int)recent.Hpmsyear-1; 
       var rows = this.context.Routes.Join(this.context.Routeshistories, 
        r => r.Routeid.ToString(), 
        h => h.Routeid.ToString(), 
        (r, h) => new { r, h });//.Where(t => t.r.Routeid == t.h.Routeid); 


       RoutesGridData = new ObservableCollection<DataRow>(); 
       int count = 0;      
       foreach (var tmpR in rows) 
       { 
        //Debug.WriteLine(tmpR.r.Routeid + " -- " + tmpR.h.Routeid); 
        if (count < 50) 
        { 
         DataRow row = new DataRow(); 

         if (tmpR.r is Route) 
         { 
          Type type = tmpR.r.GetType(); 
          foreach (PropertyInfo info in type.GetProperties()) 
          { 
           // Debug.WriteLine(info.Name + "--- NAME OF PRR"); 
           var val = info.GetValue(tmpR.r, null); 
           if (!info.Name.Equals("EntityConflict") 
            && !info.Name.Equals("ValidationErrors") 
            && !info.Name.Equals("HasValidationErrors") 
            && !info.Name.Equals("EntityState") 
            && !info.Name.Equals("HasChanges") 
            && !info.Name.Equals("IsReadOnly") 
            && !info.Name.Equals("EntityActions")) 
           { 
            row[info.Name] = val; 
           } 
          } 
         } 
         // other tables... 
         RoutesGridData.Add(row); 

        } 
        count++;       
       } 

      }, null); 
     } 
    // var b = ro; 
    } 

此代码工作正常,像50行的小记录。但是当它试图转换所有数据时变慢。和屏幕崩溃。我认为这是因为反思。有没有其他方法可以将我的提取数据转换为Dictionary?意味着我可以映射我的表在实体框架或LINQ到字典中能为我做到这一点没有得到我的代码慢等

我的实体与EF 6 &映射余米使用Deart oracle的连接器。

回答

0

由于反思,它变得非常缓慢,所以我在Linq查询期间做了一段时间的工作,我有什么数据与我在一起。

var rowss = this.context.Routes.Join(this.context.Routeshistories, 
         r => r.Routeid, 
         h => h.Routeid, 
         (r, h) => new DataRow(
          (from x in r.GetType().GetProperties() select x).Where(x => x.Name != "EntityConflict" 
           && x.Name != "ValidationErrors" 
           && x.Name != "HasValidationErrors" 
           && x.Name != "HasChanges" 
           && x.Name != "EntityState" 
           && x.Name != "IsReadOnly" 
        && x.Name != "EntityActions") 
        .ToDictionary(x => x.Name, x => (x.GetGetMethod().Invoke(r, null) == null ? "" : x.GetGetMethod().Invoke(r, null))), 
          (from x in h.GetType().GetProperties() select x).Where(x => x.Name == head) 
          .ToDictionary(x => x.Name + "-" + year.ToString(), x => (x.GetGetMethod().Invoke(h, null) == null ? "" : x.GetGetMethod().Invoke(h, null)))) 
         );// , new EqualityComparerString() 

RoutesGridData = new ObservableCollection<DataRow>(rowss);