dapper - Dapper 中的多重映射。在 SpiltOn 中收到错误

标签 dapper multimap

*您能解释一下多重映射中的 Split on 函数吗 *

我正在尝试使用 Dapper ORM 从数据库获取数据。我收到以下错误 System.ArgumentException:使用多重映射 API 时,如果您有 Id 以外的键,请确保设置 splitOn 参数 参数名称:splitOn

 public abstract class Domain
    {
       public Guid Id { get; set; }
    }


public abstract class ItemBase : Domain
  {
     private IList<Image> images = new List<Image>();
     public Guid? ParentId { get; set; }
     public string Name { get; set; }
     public IList<Image> Images { get { return images; } }
  }

 public class Meal : ItemBase
   {

   }

public class Item : ItemBase
  {
     private IList<Meal> meals = new List<Meal>();
     public IList<Meal> Meals { get { return meals; } };
  }


public class Image : Domain
  {
      public byte Img { get; set; }
       public string Description { get; set; }
   }



 public  class MealImageLink : Domain
 {
     public Guid ItemId { get; set; }
     public Guid ImageId { get; set; }
 }

/* 搜索函数从表中获取数据 */

private List<Meal> SearchMeals(Guid id)
 {
   var query = @"SELECT meal.[Name],meal.[Description],meal.

   [Price],mealImage.[Image] as Img    
                                  FROM      [MealItems] as meal  
                                  LEFT JOIN   [MealImageLink] mealImageLink 

  on meal.Id= mealImageLink.MealItemId
                                  LEFT JOIN   [Images] mealImage on  

   mealImageLink.ImageId=mealImage.Id
                                  WHERE  meal.[ParentId]=@Id";

List<Meal> meals = ( _connection.Query<Meal, MealImageLink, Image, Meal>
                                       (query, (meal, mealLink, mealImage) =>
                                       {
                                           meal.Images.Add(mealImage);
                                           return meal;
                                       }, new { @Id = id })).ToList();
return meals;
}

最佳答案

多 map 功能实际上更适合以下场景:

select foo.Id, foo.whatever, ...,
       bar.Id, bar.something, ...,
       blap.Id, blap.yada, ...
from foo ...
inner join bar ...
left outer join blap ...

或者更懒但并不罕见:

select foo.*, bar.*, blap.*
from ...
inner join bar ...
left outer join blap ...

但是在这两种情况下,都有一种清晰可见的方法将水平范围划分为多个分区;基本上,每当您看到名为 Id 的列时,它是下一个 block 。名称Id为方便起见,可以配置,并且可以是用于每个表具有不同主键名称的场景的分隔列列表(因此 User 可能有 UserId 等)。

您的情况似乎与此完全不同。您当前似乎只选择了 4 列,没有特殊的方式将它们分开。我建议在这种情况下,通过不同的 API 填充模型会更容易 - 特别是 dynamic API:

var meals = new List<Meal>();
foreach(var row in _connection.Query(sql, new { @Id = id }))
{
    string name = row.Name, description = row.Description;
    decimal price = row.Price;
    // etc

    Meal meal = // TODO: build a new Meal object from those pieces
    meals.Add(meal);
}

dynamic只需不指定任何 <...> 即可访问 API 。完成此操作后,可以通过名称访问列,其类型由它们被分配的内容暗示 - 因此如下:

decimal price = row.Price;

注意:如果你想消费row数据“内联”,然后尽快转换,即

// bad: forces everything to use dynamic for too long
new Meal(row.Name, row.Description, row.Price);

// good: types are nailed down immediately
new Meal((string)row.Name, (string)row.Description, (decimal)row.Price);

这有帮助吗?

Tl;dr:我只是认为多重映射与您的查询无关。


编辑:这是我对你打算做什么的最佳猜测 - 它根本不适合多 map :

var meals = new List<Meal>();
foreach (var row in _connection.Query(query, new { @Id = id })) {
    meals.Add(new Meal {
        Name = (string)row.Name,
        Images = {
            new Image {
                Description = (string)row.Description,
                Img = (byte)row.Img
            }
        }
    });
}
return meals;

关于dapper - Dapper 中的多重映射。在 SpiltOn 中收到错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35620921/

相关文章:

c++ - 使用 equal_range 从 multimap 搜索返回而不会出错

c++ - 试图理解为什么 multimap 会像现在这样构造/分解结构

c# - Dapper 可以返回映射对象和其他非映射值吗?

.net - 使用 Dapper-dot-net,如何将 SQL uniqueidentifier 列映射到 .Net 类型?

dapper - 对于 varbinary 数据类型,DynamicParameters (Dapper) 的正确用法是什么?

c# - 将数据库表传输到类/类到数据库表

java - 具有良好(插入,迭代)性能特征的Java中的原始多图

c# - 来自单个查询的 Dapper 多个结果

c++ - 无法访问 multimap 迭代器的方法?

java - 用于异构 Multimap 的 Gson 适配器