如何使用 Dapper 从数据库映射到字典?

How to map to a Dictionary from database using Dapper?

我有一个 class :

public class TestClass
{
    public string value1 {get; set;}
    public string value2 {get; set;}
    public string value3 {get; set;}
    public string value4 {get; set;}
}

和数据库:


Database - Test

id    code    value1    value2    value3     value4
--    ----    ------    ------    ------     ------

1     1000    xxxxx     xxxxx     xxxxx      xxxxx
2     1000    yyyyy     .....     .....      .....
3     1000    yyyy3     .....     .....      .....
4     1000    yyyy4
5     2000    yyyy5
6     2000    yyyy6
7     3000    yyyy7
8     3000    yyyy8
9     4000    yyyy9
10    4000    y9999

这将是 4 个键和 4 个 TestClass 列表。 string 是代码,rest 是 testClass 列表。

我想将它映射到这个字典:如果代码相同,将它添加到 TestClass 列表中。

Dictionary<string, List<TestClass>> testDic = new Dictionary<string, List<TestClass>>();
testDic = conn.Query("SELECT * FROM Test").ToDictionary(x=> x.????) ;

怎么做? 我认为它类似于 think 但它不起作用?

您似乎在尝试按 code 分组。为此,我会做类似的事情:

public class TestClass
{
    public int Id {get;set;}
    public string Code {get;set;}
    public string Value1 {get; set;}
    public string Value2 {get; set;}
    public string Value3 {get; set;}
    public string Value4 {get; set;}
}
/// ...
testDic = conn.Query<TestClass>("SELECT * FROM Test").ToLookup(x=> x.Code);

这里的 ToLookup 是标准的 LINQ,它的工作方式很像 Dictionary<TKey, List<TValue>>,但是是内置的(本质上 很像 GroupBy,但打算多次访问)。

如果您实际上需要字典,它会更复杂; ToDictionary 不会真正帮助你,所以最实用的方法可能是:

var data = new Dictionary<string, List<TestClass>>();
foreach (var row in conn.Query<TestClass>("SELECT * FROM Test"))
{
    if (!data.TryGetValue(row.Code, out var list))
    {
        data.Add(row.Code, list = new List<TestClass>());
    }
    list.Add(row);
}