2016-04-21 8 views
0

Hintergrund:Objekt zur Liste C# und SSIS

Bit eines seltsam. Mit SSIS, um mit Daten aus einer API kommt, wird mein erstes Skript die Daten und legt sie gegen eine stark typisierte Modell namens „TestModel“

Das SSIS-Paket speichert dann die resultierende Information an eine Variable, die dann übergeben wird in den nächsten Teil des SSIS-Pakets. SSIS-Namensräume werden nicht herumgetragen, so dass jede Skriptaufgabe isoliert ist.

Script Task Ein Namensraum: ST_a048e0de86e1432d8da6f60b5d7055db

Script Task Zwei Namensraum: SC_0573a66ec6c0486a98ee00cea4365654

Das Problem:

Der zweite SSIS Skript-Task die Variable nimmt und liest Es ist in Ordnung, ich kann alle meine Zeilen und alle relevanten Daten debuggen. Jetzt beginnen die Dinge immer seltsam, die Art der Liste, wenn es erreicht mein zweites Skript

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

Jedes der Objekte in diesen Generic.List hat die Art von:

ST_a048e0de86e1432d8da6f60b5d7055db.TestModel 

Was kann ich mit dieser Liste zu tun ? Ziemlich viel nichts ... Ich habe die TestModel.cs von Skript-Namespace eins in Namespace zwei dupliziert, in der Hoffnung, dass es nur auf gut passen würde, wenn ich eine neue Liste erstellt und das Objekt auch übergeben, ach nein.

Was ich versucht habe, so weit:

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' 

Mein Endziel ist, dass ich etwas brauche ich kann durch die Schleife und manipulieren in ein Objekt SSIS verdauen kann. Dieser Teil ist einfach, aber es ist sehr schwierig, ihn in die Schleife zu bekommen!

Extra Hinweis: SSIS-Pakete sind wirklich nervig mit Abhängigkeiten so wirklich zu vermeiden, etwas Besonderes zu verwenden. Auch die Namensräume sind zu 100% voneinander isoliert, eine Kommunikation zwischen beiden ist nicht möglich.

Antwort

0

Try 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

geben, die irgendwie funktioniert, erstellt die Liste ohne einen Laufzeitfehler, obwohl es 0 Zeilen enthält, ähnlich der Befehlsliste Test1 = Daten als Liste . Danke für den Versuch, obwohl – Caz1224

+0

@ Caz1224 können Sie nicht einfach durch Ihre IEnumerable Schleife, um Ihr Ding zu tun? IEnumerable list = (IEnumerable) Daten; arbeitet für dich richtig. Sie können darauf hinweisen. –

+0

Die Foreach funktioniert in einem Sinne, dass ich die Liste durchlaufen kann, aber was in die Schleife übergeben wird, ist ein Objekt mit dem alten Typ, das gibt mir keine Möglichkeit, iteinloop.Index oder iteinloop [Index] als es zu sagen hat nichts darin, als auf das ganze Objekt zu zeichnen. – Caz1224

0

Sie könnten versuchen, AutoMapper mit Ihrem TestModel Klassen miteinander kartieren. Es ist einfach einzurichten und zu verwenden.Diese

ist aus der Spitze von meinem Kopf, so dass es Zwicken brauchen könnte, aber der Code aussehen würde sehr ähnlich wie diese:

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

var mapper = config.CreateMapper();  

Dann könnten Sie die listTest wandeln die mapper wie folgt aus:

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

EDIT: Versuch 2

Sie sagten, Sie versucht, die TestModel Klasse auf den zweiten Namensraum zu bewegen. Wenn nicht, müssen Sie es möglicherweise hinzufügen oder etwas Ähnliches. Dann könnte es so einfach sein wie der Versuch, dies:

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

, dass Sie sollten einen neuen List<TestModel>

+0

Ich könnte Ihre Antwort als letzten Ausweg behalten, laden Abhängigkeiten sind wirklich schmerzhaft in SSIS und ich möchte sie vermeiden, wenn ich kann – Caz1224

+0

Ich habe mir das mal wieder angesehen ... Und es wird wahrscheinlich nicht funktionieren. Im zweiten Skript ist ST_a048e0de86e1432d8da6f60b5d7055db.TestModel nicht vorhanden. Jedes Skript funktioniert als unabhängiges Projekt – Caz1224

+0

Gut in der Theorie, obwohl Daten immer noch ein Objekt sind und nicht .elect als Funktion haben – Caz1224