标签: multi-mapping

Multi-Mapper用于创建对象层次结构

我一直在玩这个,因为它看起来感觉很像记录的帖子/用户示例,但它略有不同,并不适合我.

假设以下简化设置(联系人有多个电话号码):

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 multi-mapping

75
推荐指数
7
解决办法
5万
查看次数

无法在Dapper中使用多映射

和Dapper一起玩,我对目前的结果非常满意 - 很有趣!

但现在,我的下一个场景是从两个表中读取数据 - a StudentAddress表.

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)

c# dapper multi-mapping

17
推荐指数
1
解决办法
2万
查看次数

如何实现这个Map <String,List <>>结构

我有如下数据:

 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提供的类或接口来实现结果,而不是使用外部库.有帮助吗?

java multimap data-structures multi-mapping

11
推荐指数
5
解决办法
5万
查看次数

将Dapper查询映射到对象集合(它本身有几个集合)

我想执行单个查询(或具有多个结果集的存储过程).我知道如何使用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)

c# dapper multi-mapping

5
推荐指数
1
解决办法
4743
查看次数

Dapper Multi Mapping 上的某些值返回 null

我使用时遇到问题DapperRubrica我有一个包含该字段的类的列表valore当我使用JOIN运行查询并确定议程类型时,该valore字段仍设置为null

我的两个班级RubricaTipoAgenda

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)

c# mysql dapper multi-mapping

5
推荐指数
1
解决办法
2670
查看次数

嵌套多映射的Dapper语法

    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)

.net dapper multi-mapping

4
推荐指数
1
解决办法
3260
查看次数

c# Dapper, SplitOn: 多个相同参数问题多重映射一对多

我有一个问题是 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)

c# one-to-many multi-mapping dapper-extensions

4
推荐指数
1
解决办法
6974
查看次数

查找多重映射具有给定键的所有值

我正在使用下面的代码在多重映射中搜索特定键的所有对。

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)

c++ multi-mapping unordered-multimap

4
推荐指数
1
解决办法
2868
查看次数