2016-04-21 31 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