如何使用 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);
}
我有一个 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);
}