如何使用 Dapper 对 SQL 输出进行分组
How to group SQL output using Dapper
假设我有这样的输出 table:
Names | Values
_______________
A | value1
A | value2
B | value3
B | value4
C | value5
我使用dapper 连接数据库。我没有直接使用 sql 命令,而是调用了一个具有多个查询的存储过程,因此我使用 QueryMultipleAsync
来获取结果,但我被困在了这个问题上。为了这个例子,任务returns只有这个。
public async Task<Something> GetData()
{
using (IDbConnection database = _mssqlDbConnectionFactory.Connect())
{
var results = await database.QueryMultipleAsync("spGetSomething");
...
IEnumerable<Something> something = results.Read< > ...
return something
}
}
public class Something
{
public string? Name { get; set; }
public List<string>? Values { get; set; }
}
此外,我使用 sql 服务器并且此输出的查询有点长,所以我没有在此处包括它,如果我是正确的,则无法将它们组合在一起,因为我需要每一个价值。
我在这里有什么选择?我可以在读取结果时使用某种 linq 对它们进行分组吗?
您可以尝试使用 class 作为 DataModel
从数据库中转您的数据。
public class DataModel
{
public string? Name { get; set; }
public string Values { get; set; }
}
然后使用 lambda Groupby
IEnumerable<Something> something = results.Read<DataModel>()
.GroupBy(x=> x.Name)
.Select(x=> new Something(){
Name = x.Key,
Values = x.Select(y=>y.Values)
});
假设我有这样的输出 table:
Names | Values
_______________
A | value1
A | value2
B | value3
B | value4
C | value5
我使用dapper 连接数据库。我没有直接使用 sql 命令,而是调用了一个具有多个查询的存储过程,因此我使用 QueryMultipleAsync
来获取结果,但我被困在了这个问题上。为了这个例子,任务returns只有这个。
public async Task<Something> GetData()
{
using (IDbConnection database = _mssqlDbConnectionFactory.Connect())
{
var results = await database.QueryMultipleAsync("spGetSomething");
...
IEnumerable<Something> something = results.Read< > ...
return something
}
}
public class Something
{
public string? Name { get; set; }
public List<string>? Values { get; set; }
}
此外,我使用 sql 服务器并且此输出的查询有点长,所以我没有在此处包括它,如果我是正确的,则无法将它们组合在一起,因为我需要每一个价值。 我在这里有什么选择?我可以在读取结果时使用某种 linq 对它们进行分组吗?
您可以尝试使用 class 作为 DataModel
从数据库中转您的数据。
public class DataModel
{
public string? Name { get; set; }
public string Values { get; set; }
}
然后使用 lambda Groupby
IEnumerable<Something> something = results.Read<DataModel>()
.GroupBy(x=> x.Name)
.Select(x=> new Something(){
Name = x.Key,
Values = x.Select(y=>y.Values)
});