我从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, *
请参阅上面的注释,我可以通过添加SelectQuerySelectT1来修复它。但是如何在.NET集合中做到这一点。
现在我需要合并这两个集合:
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收藏.
发布于 2020-12-30 08:04:26
如果您试图添加默认值,则可以执行以下操作
orderDetails = connection.Query("SELECT * FROM Table1").Select(x =>
{
dynamic y = x;
y.table= "T1";
return y;
}).ToList();
但是,如果您想要实例化的默认值,就可以像前面提到的那样更改查询,或者拥有一个具有默认值的类,这样您就可以得到类的一个实例,而不是获得一个动态返回。
编辑:
如果您真的希望将对象绑定/转换为数据网格,那么最好遵循Anup提到的expandoObject示例。
以下问题与此有关:
发布于 2021-01-03 05:39:03
当我们使用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" }));
这将为您提供具有两个属性的元素集合:行和表
https://stackoverflow.com/questions/65455851
复制相似问题