所以我真的尝试在多个数据库的多个存储过程中使用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>
。
有没有办法加入这些,而不是连接,没有循环?
答案 0 :(得分:1)
在linq中,您可以将连接查询编写为此
var res = list1.Join(list2, a => a.monthyear , b => b.monthyear ,
(a, b) => new { a.monthyear,a.returned, b.submitted, b.approved});
但我不确定它是如何在内部实施的
修改强>
在这种情况下,你需要先使用反射(你可以增强它)
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});
如果你不知道他们的名字
,请检查this以选择所有属性希望这会有所帮助
答案 1 :(得分:0)
好吧,如果没有其他原因,那么循环将是必需的,而不是循环通过SP结果,因为它们来自数据库。
除此之外,您可以拥有一个Dictionary<string, Dictionary<string, object>>
来保存最终结果。反射可以在每个记录进入时从所有记录中拉出所有属性,并将它们放入Dictionary<string, object>
每个记录(由属性名称键入,值为属性值)。然后将这些词典合并到大Dictionary<string, Dictionary<string, object>>
中,该大DataTable
由您感兴趣的任何属性键入(看起来像&#34; monthyear&#34;属性)。
甚至可能不需要反思,例如如果您使用com.esotericsoftware.kryo.KryoException: Encountered unregistered class ID: 13994
,那么您已经拥有对所有记录字段名称和值的编程访问权。