[英]Is this an efficient way of mapping with Dapper?
我试图 map 类别实体内的 Products 和 CategoryPictures 属性列表。
然后我在 CategoryPictures 中映射图片 object。
我不确定这是否是我第一次使用 dapper 的有效方式。 我曾经使用实体框架。
我使用 Dapper 而不是 EF,因为我想提高我的 sql 技能。
我应该使用多个结果吗?
public async Task<IEnumerable<Category>> GetCategoriesListAsync()
{
using (var conn = SqlConnection())
{
string sql = @"select c.*, cp.*, pd.*, p.*
from Categories c
inner join CategoryPictures cp on cp.CategoryId = c.Id
inner join Products pd on pd.CategoryId = c.Id
inner join Pictures p on p.Id = cp.PictureId";
//string sqlmulti = $@"select * from {tableName};
// select * from Products";
//List<Category> cat = null;
//List<Product> prod = null;
//using (var lists = conn.QueryMultiple(sqlmulti))
//{
// cat = lists.Read<Category>().ToList();
// prod = lists.Read<Product>().ToList();
//}
var lookup = new List<Category>();
await conn.QueryAsync<Category, CategoryPicture, Product, Picture, Category>(sql,
(c, cp, pd, p) =>
{
if (lookup.FirstOrDefault(x => x.Id == c.Id) == null)
{
lookup.Add(c);
}
c.CategoryPictures.AsList().Add(cp);
c.Products.AsList().Add(pd);
foreach (var item in c.CategoryPictures)
{
item.Picture = p;
}
return null;
});
return lookup;
}
}
我已经删除了 Category 和 Product 之间的链接,其中 Product 是 Category 的子级。
我在之前的代码中遇到的问题是 CategoryPictures 的 Picture 子项没有正确填充。 所以我在填充 CategoryPicture 之前设置了 CategoryPicture 的图片 object。
public async Task<IEnumerable<Category>> GetAllCategories()
{
using (var conn = SqlConnection())
{
string sql = @"select c.Id, c.Name, c.Description, c.Created, c.LastModified,
cp.Id, cp.CategoryId, cp.PictureId,
p.Id, p.Url
from Categories c
inner join CategoryPictures cp on cp.CategoryId = c.Id
inner join Pictures p on p.Id = cp.PictureId";
var lookup = new Dictionary<int, Category>();
await conn.QueryAsync<Category, CategoryPicture, Picture, Category>(sql,
(c, cp, p) =>
{
if (!lookup.TryGetValue(c.Id, out Category found))
{
lookup.Add(c.Id, found = c);
}
cp.Picture = p;
found.CategoryPictures.AsList().Add(cp);
return null;
});
return lookup.Values.ToList();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.