我正在尝试使用dapper的Multimapping功能返回MenuCategories和相关Menus的列表。但是我收到以下错误: -
使用多映射API时,请确保设置splitOn参数if 你有Id以外的钥匙
以下是我的课程: -
VMMenuCategory.cs
public class VMMenuCategory
{
public int MenuCategoryID { get; set; }
public string CategoryName { get; set; }
public System.DateTime CreatedOn { get; set; }
public DateTime? UpdatedOn { get; set; }
public List<VMMenu> Menus { get; set; }
}
VMMenus.cs
public class VMMenu
{
public int MenuID { get; set; }
public int MenuCategoryID { get; set; }
public string ProductName { get; set; }
public int? CostPrice { get; set; }
public int? SellingPrice { get; set; }
public System.DateTime CreatedOn { get; set; }
public DateTime? UpdatedOn { get; set; }
}
MenuCategoriesRepository.cs
public sealed class MenuCategoryRepository : Connection, IMenuCategoryRepository
{
List<VMMenuCategory> IMenuCategoryRepository.GetAllMenuCategories()
{
List<VMMenuCategory> _lstVMMenuCategory = new List<VMMenuCategory>();
string query = "select * from [dbo].[MenuCategories]";
using (var connection = GetConnection())
{
var data = connection.Query<VMMenuCategory, VMMenu, VMMenuCategory>(query, map:(mc,m) => { mc.Menus =new List<VMMenu>() ;return mc; },splitOn: "MenuID").ToList();
return data;
}
//return _lstVMMenuCategory;
}
}
答案 0 :(得分:1)
为了使用来自两个表的数据填充两个对象,您必须查询两个表。在你的情况下,它很可能是内部联接:
public sealed class MenuCategoryRepository : Connection, IMenuCategoryRepository
{
List<VMMenuCategory> IMenuCategoryRepository.GetAllMenuCategories()
{
List<VMMenuCategory> _lstVMMenuCategory = new List<VMMenuCategory>();
string query = @"
select mc.*, m.*
from [dbo].[MenuCategories] mc,
join [dbo].[Menus] m on mc.MenuCategoryID = m.MenuCategoryID
";
using (var connection = GetConnection())
{
var data = connection.Query<VMMenuCategory, VMMenu, VMMenuCategory>(
query,
map:(mc,m) => {
var foundMc = _lstVMMenuCategory
.FirstOrDefault(x => x.MenuCategoryID = mc.MenuCategoryID);
if (foundMc == null) {
foundMc = mc;
foundMc.Menus = new List<VMMenu>() ;
}
foundMc.Menus.Add(m);
return mc;
},
splitOn: "MenuID").ToList();
}
return _lstVMMenuCategory;
}
}
注意:我猜测了第二个表名,并假设MenuID
在Menus
表定义中排在第一位。但是,最好在select子句中明确列出所有必需的列。
我还略微修改了mapper函数,以避免在类别集合中出现重复。
答案 1 :(得分:0)
我已经更改了方法以填充分层数据。
以下是代码:
public sealed class MenuCategoryRepository : Connection, IMenuCategoryRepository
{
List<VMMenuCategory> IMenuCategoryRepository.GetAllMenuCategories()
{
List<VMMenuCategory> _lstVMMenuCategory = new List<VMMenuCategory>();
string query = @"
select mc.*, m.*
from [dbo].[MenuCategories] mc
join [dbo].[Menu] m on mc.MenuCategoryID = m.MenuCategoryID";
using (var connection = GetConnection())
{
var vmMenuCategoryDictionary = new Dictionary<int, VMMenuCategory>();
var data = connection.Query<VMMenuCategory, VMMenu, VMMenuCategory>(
query,
map: (mc, m) =>
{
VMMenuCategory _VMMenuCategory;
if(!vmMenuCategoryDictionary.TryGetValue(mc.MenuCategoryID,out _VMMenuCategory))
{
_VMMenuCategory = mc;
_VMMenuCategory.Menus = new List<VMMenu>();
vmMenuCategoryDictionary.Add(_VMMenuCategory.MenuCategoryID, _VMMenuCategory);
}
_VMMenuCategory.Menus.Add(m);
return _VMMenuCategory;
},
splitOn: "MenuID").Distinct().ToList();
_lstVMMenuCategory = data;
}
return _lstVMMenuCategory;
}
}