2016-04-21 75 views
0

背景:對象列出C#和SSIS

一個奇怪的一個位。使用SSIS處理來自API的數據來了,我的第一個腳本獲取數據,並把它反對所謂「TestModel」強類型模型

然後SSIS包所產生的信息保存到一個變量,然後通過進入SSIS包的下一部分。由於SSIS名稱空間不被執行,所以每個腳本任務都是孤立的。

腳本任務的一個命名空間:ST_a048e0de86e1432d8da6f60b5d7055db

腳本任務的命名空間:SC_0573a66ec6c0486a98ee00cea4365654

的問題:

第二SSIS腳本任務拿起變量和讀取這很好,我可以在調試看到我所有的行和所有相關數據。現在,事情開始變得怪異,名單的類型,當它到達我的第二個腳本

object {System.Collections.Generic.List<ST_a048e0de86e1432d8da6f60b5d7055db.TestModel>} 

每個對象在這個Generic.List具有的類型:

ST_a048e0de86e1432d8da6f60b5d7055db.TestModel 

我能有這份名單做?幾乎沒有... 我已經重複了TestModel.cs從腳本命名一個到名字空間2希望它只是匹配很好,如果我創建了一個新的列表,並通過對象太吧,唉沒有。

我迄今爲止嘗試:

IEnumerable e = data as List<TestModel>; //Returns 0 rows 
IEnumerable list = (IEnumerable)data; // returns all rows, type System.Collections.IEnumerable {System.Collections.Generic.List<ST_a048e0de86e1432d8da6f60b5d7055db.TestModel>} 
List<TestModel> listtest = ((TestModel[])data).ToList() // Runtime error 
List<TestModel> listtest2 = list.Cast<TestModel>().ToList(); //Runtime error - Unable to cast type 'ST_a048e0de86e1432d8da6f60b5d7055db.TestModel' to type 'SC_0573a66ec6c0486a98ee00cea4365654.TestModel' 

我的最終目標是,我需要的東西我可以遍歷和操縱成一個對象SSIS可以消化。這部分很容易,但是讓它循環是非常困難的!

額外注:SSIS包與依賴關係真的很煩人所以真的希望避免使用任何特殊。也名稱空間是從另一個100%分離,兩者之間沒有通信是可能的。

回答

0

嘗試使用Enumerable.OfType Method (IEnumerable)

List<TestModel> list = ((IEnumerable)data).OfType<TestModel>().ToList(); 

UPDATE:

IEnumerable list = (IEnumerable)data; 

foreach(var testModel in list) 
{ 
    // manipulate testModel into an object SSIS can digest 
} 
+0

這有點兒工作,列表創建不運行時錯誤,雖然它包含0行,類似的命令列表 Test1 =數據爲列表。謝謝你嘗試 – Caz1224

+0

@ Caz1224你不能只是循環通過你的IEnumerable做你的事情? IEnumerable list =(IEnumerable)數據;爲你工作的權利。你可以對它進行foreach。 –

+0

從某種意義上說,我可以遍歷列表,儘管傳入循環的對象是舊類型的對象,這使我無法說itenmloop.Index或iteminloop [Index]沒有任何內容,只能在整個對象上串起。 – Caz1224

0

你可以嘗試使用AutoMapper您TestModel類映射到對方。這很容易設置和使用。

這是把我的頭,所以可能需要的調整的頂部,但代碼看起來非常類似於這樣:

var config = new MapperConfiguration(cfg => { 
    CreateMap<ST_a048e0de86e1432d8da6f60b5d7055db.TestModel 
       , SC_0573a66ec6c0486a98ee00cea4365654.TestModel>(); 
    cfg.AddProfile<testModel>(); 
}); 

var mapper = config.CreateMapper();  

然後,你可以使用mapper這樣轉換listTest

var convertedList = mapper.Map<ST_a048e0de86e1432d8da6f60b5d7055db.TestModel> 
        , IList<SC_0573a66ec6c0486a98ee00cea4365654.TestModel>>(listTest); 

編輯:嘗試2

你說你試過TestModel類移動到第二個命名空間。如果不是的話,你可能需要添加它或者其他的東西。然後,它可能是因爲這試圖簡單:

var listTest = data.Select(x => new TestModel 
         { property1 = x.property1, 
         property2 = x.property2 
         //etc... 
         }).ToList(); 

這應該給你一個新的List<TestModel>

+0

我可能會保留你的答案作爲最後的手段,加載依賴關係在SSIS中真的很痛苦,我想避免它們,如果我可以 – Caz1224

+0

只是再看看這個......它可能不會工作。在第二個腳本中ST_a048e0de86e1432d8da6f60b5d7055db.TestModel不存在。每個腳本作爲一個獨立的項目起作用 – Caz1224

+0

理論上好,儘管數據仍然是一個對象,並沒有選擇作爲一個函數 – Caz1224