2017-03-09 28 views
0

所以我真的想在C#中建立基於多個數據庫的多個存儲過程的動態報告,然後加入結果。加入多個動態列表的對象

下面是一個例子:

列表1:

{ monthyear = '032016', submitted = '56', approved = '27'}, 
    { monthyear = '042016', submitted = '67', approved = '30'} 

列表2

{ monthyear = '032016', returned = '17'}, 
    { monthyear = '042016', returned = '22'} 

即使知道 「鍵」 列是動態的,內置在每個列表中的結果是動態。然而,我能夠檢索連接列表的鍵列的字符串表示。

我找的結果是:

{ monthyear = '032016', submitted = '56', approved = '27', returned = '17'}, 
    { monthyear = '042016', submitted = '67', approved = '30', returned = '22'} 

兩個列表存儲爲IEnumerable<object>IEnumerable<object>預期的結果。

有沒有辦法加入這些,不concat,沒有循環?

回答

1

在LINQ可以編寫連接查詢,因爲這

var res = list1.Join(list2, a => a.monthyear , b => b.monthyear , 
(a, b) => new { a.monthyear,a.returned, b.submitted, b.approved}); 

,但我真的不知道它是如何在內部

執行編輯

在這種情況下,您`ll需要首先使用反射(你可以加強這個)

foreach (PropertyInfo p in typeof(firstObj).GetProperties()) 
     { 
      foreach (PropertyInfo p2 in typeof(secondObject).GetProperties()) 
       if (p.Name == p2.Name) 
        match = p.Name; 
     } 

個現在變量匹配存儲密鑰字符串

list1.Join(list2, a=>a.GetType().GetProperty(match).GetValue(a,null), b => b.GetType().GetProperty(match).GetValue(b,null), (a, b) => new { a.first, a.second..... }); 

, (a,b) => new { a, b}); 

我的指南是thisthis

morever檢查this選擇所有的屬性,如果你不`噸知道他們的名稱

希望這有助於

+0

問題是我不知道,直到我檢索結果什麼是鏈接列,所以我不能使用lambda語法,需要了解monthyear。 – duckmike

+0

匹配定義在哪裏,它是什麼類型的對象? – duckmike

+0

匹配是一個字符串 –

0

那麼,如果沒有其他原因,循環將被要求,而不是循環通過SP結果,因爲它們來自數據庫。

除此之外,你可以有一個Dictionary<string, Dictionary<string, object>>,將保留最終結果。反射可以將所有屬性從每個記錄中取出,並將它們放入每個記錄的Dictionary<string, object>(由屬性名稱鍵入,值爲屬性值)。然後將這些字典合併爲大的Dictionary<string, Dictionary<string, object>>,該字段由您感興趣的任何屬性(看起來像「monthyear」屬性)鍵入。

反射可能甚至不需要,例如如果您使用的是DataTable,那麼您已經可以對所有記錄字段名稱和值進行編程訪問。