Asp.net mvc Dapper.net-如何在单个命令中映射多对多关系

Asp.net mvc Dapper.net-如何在单个命令中映射多对多关系,asp.net-mvc,orm,asp.net-mvc-5,dapper,Asp.net Mvc,Orm,Asp.net Mvc 5,Dapper,我有一个地方对象 它可以有许多与之关联的标记 标记可以与许多位置关联 (虽然这是一种多对多的关系——我想在概念上它也可能是一对多——一个对象集合——每个对象都包含一个对象集合) 每个Place对象都有一个与其关联的列表集合: public class Place { public Guid Id { get; set; } public string PlaceName { get; set; } ... public List<Tag> Tags {

我有一个地方对象

它可以有许多与之关联的标记

标记可以与许多位置关联

(虽然这是一种多对多的关系——我想在概念上它也可能是一对多——一个对象集合——每个对象都包含一个对象集合)

每个Place对象都有一个与其关联的列表集合:

public class Place
{
    public Guid Id { get; set; }
    public string PlaceName { get; set; }
    ...
    public List<Tag> Tags { get; set; }
}

public class Tag
{
    public Guid Id { get; set; }
    public string TagName { get; set; }
}
我可以在单个Dapper命令(或者至少不是n+1命令)中映射所有这些吗?Github文档涵盖一对多关系,但不是多对多关系

(我之所以需要这样做,是因为我想输出一个包含所有位置的网格,并且我希望其中一列是以逗号分隔的标记列表(我将创建一个助手,它接受标记集合并输出以逗号分隔的字符串)

我在建议使用Slapper.AutoMapper的地方看到了一个类似的问题:

如果可能的话,我宁愿避免使用额外的库——但我想这里可能需要它

最好的方法是什么

我想输出一个包含所有位置的网格,我希望一列是一个网格 以逗号分隔的标记列表

由于需要所有位置,因此需要使用左连接而不是内部连接来获取所有位置及其关联的标记

这个查询将给出一个包含3列的结果集:Id、Name和TagName。我将为结果集记录创建一个简单的DTO

internal class PlaceTagDto
{
   public Guid Id { internal set;get;}
   public string Name { internal set;get;}
   public string TagName { internal set; get }
}
现在使用Dapper执行查询并将结果映射到PostTagDto集合。然后按标记名对结果进行分组

using(var c=new SqlConnecction("YourConnectionString"))
{
  var r=cn.Query<PlaceTagDto>(query);
  var grouped=r.GroupBy(s => s.Id, i => i,
                    (k, groupdPlaces) => new Place {
                               Id = k, 
                               PlaceName = groupdPlaces.First().Name,
                               Tags = groupdPlaces.Where(y=>y.TagID!=null)
                                                  .Select(t=>new Tag
                                                                 { 
                                                                   TagName = t.TagName
                                                                 }).ToList() 
                                                   });
}
internal class PlaceTagDto
{
   public Guid Id { internal set;get;}
   public string Name { internal set;get;}
   public string TagName { internal set; get }
}
using(var c=new SqlConnecction("YourConnectionString"))
{
  var r=cn.Query<PlaceTagDto>(query);
  var grouped=r.GroupBy(s => s.Id, i => i,
                    (k, groupdPlaces) => new Place {
                               Id = k, 
                               PlaceName = groupdPlaces.First().Name,
                               Tags = groupdPlaces.Where(y=>y.TagID!=null)
                                                  .Select(t=>new Tag
                                                                 { 
                                                                   TagName = t.TagName
                                                                 }).ToList() 
                                                   });
}
@model IEnumerable<Place>
<table>
@foreach(var p in Model)
{
  <tr>
      <td>@p.Name</td>
      <td>
          @String.Join(",",p.Tags.Select(s=>s.TagName))
      </td>
   </tr>
}
</table>