我一直在玩这个,因为它看起来感觉很像记录的帖子/用户示例,但它略有不同,并不适合我.
假设以下简化设置(联系人有多个电话号码):
public class Contact
{
public int ContactID { get; set; }
public string ContactName { get; set; }
public IEnumerable<Phone> Phones { get; set; }
}
public class Phone
{
public int PhoneId { get; set; }
public int ContactID { get; set; } // foreign key
public string Number { get; set; }
public string Type { get; set; }
public bool IsActive { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我希望最终能够返回一个与多个Phone对象联系的东西.这样,如果我有2个联系人,每个联系人有2个电话,我的SQL将返回一个连接,作为结果集共4行.然后Dapper将弹出2个接触对象,每个接触对象有两部手机.
这是存储过程中的SQL:
SELECT *
FROM Contacts
LEFT …Run Code Online (Sandbox Code Playgroud) 和Dapper一起玩,我对目前的结果非常满意 - 很有趣!
但现在,我的下一个场景是从两个表中读取数据 - a Student和Address表.
Student表有一个主键StudentID (INT IDENTITY),Address有一个AddressID (INT IDENTITY).Student还有一个名为AddressID链接到Address表中的FK .
我的想法是创建两个类,每个表一个,具有我感兴趣的属性.另外,我在C#中将PrimaryAddress类型的属性Address放到我的Student类中.
然后我尝试在单个查询中检索学生和地址数据 - 我模仿Github页面上给出的样本:
var data = connection.Query<Post, User>(sql, (post, user) => { post.Owner = user; });
var post = data.First();
Run Code Online (Sandbox Code Playgroud)
在这里,检索a Post和a User,并将帖子的所有者设置为用户 - 返回的类型是Post- 正确吗?
所以在我的代码中,我为通用Query扩展方法定义了两个参数- Student作为第一个应该返回的参数,Address第二个参数将存储到学生实例中:
var student = _conn.Query<Student, Address> …Run Code Online (Sandbox Code Playgroud) 我有如下数据:
Key value
----- ------
car toyota
car bmw
car honda
fruit apple
fruit banana
computer acer
computer asus
computer ibm
...
Run Code Online (Sandbox Code Playgroud)
(上述数据中的每一行是一个对象与字段"键"和"值",都在一个列表List<DataObject>)
我想将数据构建成Map<String, List<String>>如下所示:
"car" : ["toyota", "bmw", "honda"]
"fruit" : ["apple","banana"]
"computer" : ["acer","asus","ibm"]
Run Code Online (Sandbox Code Playgroud)
如何Map从数据对象中实现上述结构?
******除了******
我更感兴趣的是使用纯JDK提供的类或接口来实现结果,而不是使用外部库.有帮助吗?
我想执行单个查询(或具有多个结果集的存储过程).我知道如何使用Dapper进行多重映射,但我无法对如何将两个集合映射到同一个父集合进行排序.基本上,给定此对象定义...
class ParentObject
{
string Name { get; set; }
ICollection<ChildObjectOne> ChildSetOne {get;set;}
ICollection<ChildObjectTwo> ChildSetTwo { get; set; }
}
class ChildObjectOne
{
string Name { get; set; }
}
class ChildObjectTwo
{
int id { get; set; }
string LocationName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我希望能够运行以某种方式产生的Dapper查询:
IQueryable<ParentObject> result = cnn.Query(
// Some really awesome dapper syntax goes here
);
Run Code Online (Sandbox Code Playgroud) 我使用时遇到问题Dapper。Rubrica我有一个包含该字段的类的列表valore。当我使用JOIN运行查询并确定议程类型时,该valore字段仍设置为null
我的两个班级Rubrica和TipoAgenda
public class Rubrica // Same as table anagrafico_rubrica
{
public int id_rubrica { get; set; }
public string cod_anagrafica { get; set; }
public string descrizione_contatto { get; set; }
public TipoRubrica tipo { get; set; }
public string valore { get; set; }
}
public class TipoRubrica // Same as table anagrafico_tipo_rubrica
{
public int id_tipo_rubrica { get; set; }
public string descrizione_tipo_rubrica …Run Code Online (Sandbox Code Playgroud) class Person
{
Address Addr { get; set; }
int Age { get; set; }
}
class Address
{
string StreetName { get; set; }
County Cnty { get; set; }
}
class County
{
string CntyName;
string CntyCode;
}
Run Code Online (Sandbox Code Playgroud)
这是我的存储过程,它填充数据库中的数据.
Create Procedure SpGetAllPersons
As
Select CntyName, CntyCode, StreetName, Age from Persons
Run Code Online (Sandbox Code Playgroud)
我试着写下dapper查询,但得到一个例外
DBConn.Query<County, Address , Person, Person>
(DomainConstants.SpGetAllPersons,
(cnty, address, person) =>
{
address.Cnty = cnty;
person.Addr = address;
return person;
},
commandType: CommandType.StoredProcedure,
splitOn: "StreetName, Age").ToList();
Run Code Online (Sandbox Code Playgroud)
我尝试使用以下概念,但它只返回单个对象.我需要一份人员名单.
var …Run Code Online (Sandbox Code Playgroud) 我有一个问题是 Dapper Query 在父对象上分割,而不是在子对象上分割。结果为每个子项返回一个父行,从而给出许多重复的父项,其中只有 1 个子项。
我正在探索的一个可能的问题是,table1 和 table2 的主键是否会在 split 函数中造成一些混乱,因为它们具有相同的名称 (.Id)。
问题是,如何拆分父子行,以便可以使用 SplitOn: 中的相同参数将许多子项绑定到一个父模型?
=================================================== =======================
结论
在评论中我们得出的结论是字典需要在函数之外,不需要多个SplitOn:,一个就足够了。
最后,字典确实提供了表 1 的不同集合,每个表都代表孩子。
请参阅评论了解更多详情。
=================================================== =======================
var sql = $@"
SELECT * FROM Table1 t
INNER JOIN Table2 c ON c.Table1_Id = t.Id;";
var result = connection.Query<Table1, Table2, Table1>(
sql,
(table1, table2) =>
{
Table1 table1Entry;
Dictionary<int?, Table1> table1Dictionary = new Dictionary<int?, Table1>();
if (!table1Dictionary.TryGetValue(table1.Id, out tableEntry))
{
table1Entry = table1;
table1Entry.table2s = new List<Table2>();
tableDictionary.Add(table1Entry.Id, table1Entry);
}
tableEntry.table2s.Add(table2);
return …Run Code Online (Sandbox Code Playgroud) 我正在使用下面的代码在多重映射中搜索特定键的所有对。
int main() {
multimap<int,int> mp;
mp.insert({1,2});
mp.insert({11,22});
mp.insert({12,42});
mp.insert({1,2});
mp.insert({1,2});
for (auto itr = mp.find(1); itr != mp.end(); itr++)
cout << itr->first<< '\t' << itr->second << '\n';
}
Run Code Online (Sandbox Code Playgroud)