如何合并两个集合并在其中添加新字段。 [带有查询<动态>的简洁 ORM]

Posted

技术标签:

【中文标题】如何合并两个集合并在其中添加新字段。 [带有查询<动态>的简洁 ORM]【英文标题】:How to merge two collections with adding new field inside it. [Dapper ORM with Query<dynamic>] 【发布时间】:2020-12-26 11:16:58 【问题描述】:

我从 Dapper 查询返回了两个集合

Table1_Collection = Query<dynamic>("SELECT * FROM Table1");    // I can make Select T1, *
Table2_Collection = Query<dynamic>("SELECT * FROM Table2");    // I can make Select T1, *

请参阅上面的评论,我可以通过添加带有查询的 Select T1 来修复它。但是如何在 .NET Collections 中做到这一点。

现在我需要合并两个集合:

List<dynamic>CombinedCollection = new List<dynamic>();
CombinedCollection.AddRange(Table1_Collection);
CombinedCollection.AddRange(Table2_Collection);

以上集合包含 table1 和 table2 中的列。我需要在 .NET 中向该集合添加一个字段,以指定该行属于哪个表。

类似的东西:

CombinedCollections.AddRange(Table1_Collections).CombineWith("T1");
CombinedCollections.AddRange(Table2_Collections).CombineWith("T2");

请注意,对于 DataTables,它具有 Columns.Add(DataColumn) 的默认值 价值。但在 Dapper 中,它只有 .NET 集合...

【问题讨论】:

【参考方案1】:

当我们使用dynamicsExpandoObject 时,添加新属性非常简单。 为了简化这个过程,让我们添加一个函数来创建并返回带有添加属性的ExpandoObject

public ExpandoObject GetDynamic(dynamic obj, string tableName)

      var exp = new ExpandoObject();
      var objnew = (IDictionary<String, Object>)obj;
      foreach (var item in objnew)
      
          exp.TryAdd(item.Key, item.Value);
      
      exp.TryAdd("Table", tableName);
      return exp;

然后试试这个:

CombinedCollections.AddRange(Table1_Collections.Select(t => GetDynamic(t, "T1")));
CombinedCollections.AddRange(Table2_Collections.Select(t => GetDynamic(t, "T2")));

但是,您也可以在不使用 ExpandoObject 的情况下执行类似操作,以实现更清晰的隔离:

CombinedCollections.AddRange(Table1_Collections.Select(t => new  t, Table = "T1" ));
CombinedCollections.AddRange(Table2_Collections.Select(t => new  t, Table = "T2" ));

这将为您提供具有 2 个属性的元素集合:行和表格

【讨论】:

我不知道伙计这是否适用于网格? GridView.DataSource ? 您正在将动态对象的集合添加到另一个动态集合中。在运行时,它只是对象的集合。 GridView 的 DataSource 只需要一个集合。它必须工作。【参考方案2】:

如果您尝试添加默认值,您可以执行以下操作

 orderDetails = connection.Query("SELECT * FROM Table1").Select(x =>
 
     dynamic y = x;
     y.table= "T1";
     return y;
 ).ToList();

但是,如果您想要一个已经实例化的默认值,那么像您提到的那样更改查询或拥有一个具有默认值的类会更容易,这样您就可以获得类的实例而不是动态返回。

编辑:

如果您真的希望对象绑定/转换为数据网格,那么您最好遵循 Anup Sharma 提到的 expandoObject 示例。

以下问题与此有关:

How can I use a List<Dynamic> as with DataGridView.DataSource?

Binding a GridView to a Dynamic or ExpandoObject object

【讨论】:

如果这在 Data-Grid 中有效,那就太好了,我会检查它...

以上是关于如何合并两个集合并在其中添加新字段。 [带有查询<动态>的简洁 ORM]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Web 应用程序运行时合并两个查询并执行新创建的查询

将两个带有输入字段的数组合并在一起

如果键值相同,如何合并 laravel 集合?或添加新的数据行

基于键合并两个数组并使用 mongodb 聚合添加新字段

如何根据字段合并两个 CSV 文件并在每条记录上保持相同数量的属性?

如何合并两个查询集并在 django 中创建新的查询集