C# 这是使用Dapper进行映射的有效方法吗?
我正在尝试映射类别实体内的产品和类别结构属性列表 然后,我将图片对象映射到CategoryPictures中 我不确定这是否是我第一次使用dapper的有效方法。我曾经使用entityframework 我使用Dapper而不是EF,因为我想提高我的sql技能 我应该使用多个结果吗C# 这是使用Dapper进行映射的有效方法吗?,c#,.net,dapper,C#,.net,Dapper,我正在尝试映射类别实体内的产品和类别结构属性列表 然后,我将图片对象映射到CategoryPictures中 我不确定这是否是我第一次使用dapper的有效方法。我曾经使用entityframework 我使用Dapper而不是EF,因为我想提高我的sql技能 我应该使用多个结果吗 public async Task<IEnumerable<Category>> GetCategoriesListAsync() { using (var con
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;
}
}
公共异步任务GetCategoriesListAsync()
{
使用(var conn=SqlConnection())
{
字符串sql=@“选择c.*,cp.*,pd.*,p*
来自c类
cp.CategoryId=c.Id上的内部联接categorypactures cp
pd.CategoryId=c.Id上的内部连接产品pd
内部连接图片p on p.Id=cp.PictureId“;
//字符串sqlmulti=$@“从{tableName}中选择*;
//选择“从产品中选择*”;
//列表cat=null;
//列表prod=null;
//使用(var list=conn.QueryMultiple(sqlmulti))
//{
//cat=lists.Read().ToList();
//prod=lists.Read().ToList();
//}
var lookup=新列表();
wait conn.QueryAsync(sql,
(c,cp,pd,p)=>
{
if(lookup.FirstOrDefault(x=>x.Id==c.Id)==null)
{
查找。添加(c);
}
c、 CategoryPictures.AsList().Add(cp);
c、 Products.AsList().Add(pd);
foreach(c.类别结构中的变量项)
{
项目.图片=p;
}
返回null;
});
返回查找;
}
}
我删除了类别和产品之间的链接,其中产品是类别的子项 我在前面的代码中遇到的问题是CategoryPictures的图片子对象没有正确填充。所以我在填充CategoryPicture之前设置CategoryPicture的图片对象
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();
}
}
公共异步任务GetAllCategories()
{
使用(var conn=SqlConnection())
{
字符串sql=@“选择c.Id、c.Name、c.Description、c.Created、c.LastModified、,
cp.Id、cp.CategoryId、cp.PictureId、,
p、 Id,p.Url
来自c类
cp.CategoryId=c.Id上的内部联接categorypactures cp
内部连接图片p on p.Id=cp.PictureId“;
var lookup=newdictionary();
wait conn.QueryAsync(sql,
(c,cp,p)=>
{
如果(!lookup.TryGetValue(c.Id,找到的类别之外))
{
lookup.Add(c.Id,found=c);
}
cp.Picture=p;
找到.CategoryPictures.AsList().Add(cp);
返回null;
});
返回lookup.Values.ToList();
}
}
将列表更改为_字典这将大大改进对现有类别id的搜索对于具有
Select*
的许多表(无论如何都应该避免),是的,我将使用多个结果集并使用字典映射。请记住,Dapper不喜欢多个具有相同属性的列names@Charlieface,我是否仍然需要对多个结果集使用Select*?或者我必须为多个结果集指定每一列吗?您可以执行select*
,但不建议这样做。最好显式地指定列,并且只拉出所需的列(否则会给服务器带来额外的负载)。