连接多个动态对象列表

时间:2017-03-09 15:26:26

标签: c# linq

所以我真的尝试在多个数据库的多个存储过程中使用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>

有没有办法加入这些,而不是连接,没有循环?

2 个答案:

答案 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});

我的指南是thisthis

如果你不知道他们的名字

,请检查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 ,那么您已经拥有对所有记录字段名称和值的编程访问权。