*您能解释一下多重映射中的 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/