Plusieurs résultats avec une relation plusieurs-à-plusieurs

c# dapper sql

Question

J'ai des objets que je veux associer à 1 - beaucoup de balises

Entités: Articles Tags ItemTag

Je souhaite retourner tous les éléments et les balises associées pour les afficher dans une grille. Donc, une collection de:

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

Je sais que Dapper peut faire plusieurs jeux de résultats, mais je ne sais pas comment utiliser cette fonctionnalité ici.

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

Alors je devrais avoir quelque chose pour les rassembler tous donc j'ai une collection:

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

MISE À JOUR: J'ai une solution, mais je voudrais une contribution sur l'optimisation

    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;
        }
    }

Réponse acceptée

Voici ce que j'ai fini avec.

  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: Filling Liste des propriétés des objets dans une boucle foreach




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi