问题描述
Id Remark1 Remark2 Remark3 Remark4
------------------------------------------------
1 AAA BBB CCC DDD
2 EEE FFF GGG HHH
如何使用以下DTO从Remark*
列中以IEnumerable<string>
的形式获取所有值?
class MyDTO
{
public int ID { get; }
public IEnumerable<string> Remarks { get; }
}
注意:我正在使用sqlkata(Dapper),您也可以在回答时使用它。
解决方法
如果您使用的是Dapper,则可以仅使用非通用查询API。这样会将每一行返回为dynamic
,但是也可以将其强制转换为IDictionary<string,object>
,这使您可以访问每个命名的列(例如,通过foreach
)。
foreach (IDictionary<string,object> row in conn.Query(sql,args))
{
var obj = new MyDto();
var vals = new List<string>();
obj.Remarks = list;
foreach ((var key,var value) in row)
{
if (key == nameof(obj.Id))
obj.Id = (int)value;
else
vals.Add((string)value);
}
// do something with obj
}
```
,
另一个选择是创建一个看起来很丑但可以使用的UNION ALL查询:
SELECT Id,Remark1 as Remark FROM Table
UNION ALL
SELECT Id,Remark2 as Remark FROM Table
UNION ALL
SELECT Id,Remark... as Remark FROM Table
那可以使用SqlKata在for..loop中完成,在循环内调用Union
https://sqlkata.com/docs/combine#union-except-intersect
未经测试的代码示例:
var q = new Query("Table").Select("Id","Remark1 as Remark");
for(int r=2;r<=50;i++)
{
var u = new Query("Table").Select("Id",$"Remark{r} as Remark");
q = q.Union(u);
}