【问题标题】:Dapper multi mapping many to many relationshipDapper 多映射多对多关系
【发布时间】:2016-06-24 23:54:18
【问题描述】:

我正在尝试使用 DB MySQL 映射与 dapper 的 N-N 关系。这或多或少是代码。

        var query = new StringBuilder();
        query.Append("SELECT O.Id, O.Email, O.Status, P.Name FROM Owners AS O");
        query.Append(" INNER JOIN OwnerPets OP ON OP.OwnerId = O.Id");
        query.Append(" INNER JOIN Pets AS P ON P.Id = OP.PetId");
        query.Append(" WHERE O.Status = @Status;");

        using (var dbConnection = CreateConnection())
        {
            return dbConnection.Query<Owner, IEnumerable<Pet>, Owner>(query.ToString(), (owner, pets) =>
            {
                owner.Pets = pets.ToList();
                return Owner;
            }, new { Status = status }, splitOn: "OwnerId, PetId");
        }

查询在 SQL 客户端中运行良好,但是当我运行上面的代码时,我得到了这个异常:“使用多映射 API 时,如果你有除 Id 以外的键,请确保设置 splitOn 参数。参数名称:splitOn”

是否可以映射具有中间表 (OwnerPets) 的 N-N 关系?...如果是这样...我做错了什么?

【问题讨论】:

    标签: c# sql dapper


    【解决方案1】:

    我不确定您是否可以让 Dapper 根据需要直接返回数据,但您可以加载数据,使 Owners 和 Pets 之间存在一对一的关系,然后使用 LINQ 查询来跟踪它为每个所有者分组宠物。

    return dbConnection
        .Query<Owner, Pet, Owner>(
            query,
            (owner, pet) =>
            {
                owner.Pets = owner.Pets ?? new List<Pet>();
                owner.Pets.Add(pet);
                return owner;
            },
            new { Status = status },
            splitOn: "Name"
        )
        .GroupBy(o => o.Id)
        .Select(group =>
        {
            var combinedOwner = group.First();
            combinedOwner.Pets = group.Select(owner => owner.Pets.Single()).ToList();
            return combinedOwner;
        });
    

    【讨论】:

      猜你喜欢
      • 2014-08-17
      • 1970-01-01
      • 2012-06-12
      • 1970-01-01
      • 1970-01-01
      • 2020-09-27
      • 1970-01-01
      相关资源
      最近更新 更多