具有多对多关系适配器的多个结果

本文关键字:适配器 结果 关系 | 更新日期: 2023-09-27 18:27:53

我有想要与1-多个标签关联的项目

实体:项目标记项目标签

我想返回所有项目和相关联的标签,以便在网格中显示。所以一个集合:

{
ItemTitle: ''
ItemTags: [ '', '', '']
}

我知道dapper可以处理多个结果集,但不确定我将如何使用这里的功能。

SELECT * FROM Items
SELECT * FROM Tags
SELECT * FROM ItemTag

然后我需要一些东西把它们放在一起,这样我就有了一个收藏:

Items: [
{
ItemTitle: ''
ItemTags: [ '', '', '']
},
{
ItemTitle: ''
ItemTags: [ '', '', '']
}
]

更新:我有一个解决方案,但希望输入优化

    public List<Item> GetAll()
    {
        var sql =
            "SELECT * FROM Items;" +
            "SELECT ItemId, Tags.Title FROM ItemTag left join Tags on ItemTag.TagId = Tags.Id;";
        using (var multipleResults = this.db.QueryMultiple(sql))
        {
            var Items = multipleResults.Read<Item>().ToList();
            var tags = multipleResults.Read<Tag>().ToList();
            foreach (var Item in Items)
            {
                var ItemTags = new List<Tag>();
                foreach (var tag in tags)
                {
                    if (tag.ItemId == Item.Id)
                    {
                        ItemTags.Add(tag);
                    }
                }
                Item.Tags = ItemTags;
            }
            return Items;
        }
    }

具有多对多关系适配器的多个结果

以下是我最终得到的结果。

  public List<Item> GetAll()
    {
        var sql =
            "SELECT * FROM Items;" +
            "SELECT ItemId, Tags.Title FROM ItemTag left join Tags on ItemTag.TagId = Tags.Id;";
        using (var multipleResults = this.db.QueryMultiple(sql))
        {
            var items = multipleResults.Read<Item>().ToList();
            var tags = multipleResults.Read<Tag>().ToList();
            var tagsByItemId = tags.ToLookup(t => t.ItemId);
            foreach (var item in items)
            {
                item.Tags = tagsByItemId[item.Id].ToList();
            }
            return items;
        }
    }

Ref:foreach循环中对象的Filling List属性