2014-10-26 7 views
-1

Я получаю большое количество данных из службы RIA. тип возврата имеет группу объектов, таких как RouteA, HistroyRouteA. У HistroyLogRouteA есть записи за разные годы с тем же уникальным ключом.Скрытая коллекция объектов для коллекции словаря <строка, объект>

Я должен динамически связывать эти данные с 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 строк. но я, когда пытаюсь преобразовать все данные, становится медленным. и сбои экрана. Я думаю, это из-за Reflection. Есть ли другой способ конвертировать данные извлечения в словарь? Значит, я могу сопоставить свою таблицу со словарем в Entity Framework, или Linq может сделать это для меня, не делая мой код медленным и т. Д.

Мои объекты сопоставлены с EF 6 & Я использую соединитель оракула Deart.

ответ

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);