首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何合并两个集合,并在其中添加新字段。[Dapper ORM与Query<dynamic>]

如何合并两个集合,并在其中添加新字段。[Dapper ORM与Query<dynamic>]
EN

Stack Overflow用户
提问于 2020-12-26 11:16:58
回答 2查看 294关注 0票数 1

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

代码语言:javascript
运行
复制
Table1_Collection = Query<dynamic>("SELECT * FROM Table1");    // I can make Select T1, *
Table2_Collection = Query<dynamic>("SELECT * FROM Table2");    // I can make Select T1, *

请参阅上面的注释,我可以通过添加SelectQuerySelectT1来修复它。但是如何在.NET集合中做到这一点。

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

代码语言:javascript
运行
复制
List<dynamic>CombinedCollection = new List<dynamic>();
CombinedCollection.AddRange(Table1_Collection);
CombinedCollection.AddRange(Table2_Collection);

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

类似于:

代码语言:javascript
运行
复制
CombinedCollections.AddRange(Table1_Collections).CombineWith("T1");
CombinedCollections.AddRange(Table2_Collections).CombineWith("T2");

注意,对于DataTables,它有默认值的Columns.Add(DataColumn)。但在Dapper中它唯一的.NET收藏.

EN

回答 2

Stack Overflow用户

发布于 2020-12-30 16:04:26

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

代码语言:javascript
运行
复制
 orderDetails = connection.Query("SELECT * FROM Table1").Select(x =>
 {
     dynamic y = x;
     y.table= "T1";
     return y;
 }).ToList();

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

编辑:

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

以下问题与此有关:

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

Binding a GridView to a Dynamic or ExpandoObject object

票数 1
EN

Stack Overflow用户

发布于 2021-01-03 13:39:03

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

代码语言:javascript
运行
复制
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;
}

然后试试这个:

代码语言:javascript
运行
复制
CombinedCollections.AddRange(Table1_Collections.Select(t => GetDynamic(t, "T1")));
CombinedCollections.AddRange(Table2_Collections.Select(t => GetDynamic(t, "T2")));

但是,您也可以这样做,而无需使用ExpandoObject进行更干净的隔离:

代码语言:javascript
运行
复制
CombinedCollections.AddRange(Table1_Collections.Select(t => new { t, Table = "T1" }));
CombinedCollections.AddRange(Table2_Collections.Select(t => new { t, Table = "T2" }));

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65455851

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档