如何合并两个集合并在其中添加新字段。 [带有查询<动态>的简洁 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】:当我们使用dynamics
和ExpandoObject
时,添加新属性非常简单。
为了简化这个过程,让我们添加一个函数来创建并返回带有添加属性的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 集合?或添加新的数据行