【问题标题】:One to many mapping on query dapper查询 Dapper 上的一对多映射
【发布时间】:2022-01-17 18:30:17
【问题描述】:

我正在尝试在 dapper 上进行一对多的查询,但由于某种原因,即使我应该从查询中获得多个值,我也只能从连接的表中返回 1 个值 谁能告诉我我做错了什么?

我尝试做以下帖子回答Mapping one to many with Dapper中提到的事情

我的代码:

   public class MonsterDatabase
{
    public int Id { get; set; }
    public int MonsterId { get; set; }
    public string Name { get; set; }
    public List<MonsterLocationDatabase> Location { get; set; }
}

public class MonsterLocationDatabase
{
    public int Id { get; set; }
    public int FkMonsterId { get; set; }
    public string Map { get; set; }
    public int Frequency { get; set; }
    public string MapImage { get; set; }
    public DateTime? DeathTime { get; set; }
    public DateTime? RespawnTime { get; set; }
}




   public static MonsterDatabase GetMonster(Monster monster)
    {
        using (var connection = new SqlConnection(config["appsettings:RagnaDatabase"]))
        {
            var Monster = connection.Query<MonsterDatabase, MonsterLocationDatabase, MonsterDatabase>(
                "select top 1 Monster.*, SplitMonster = '', MonsterLocation.*" +
                " from Monster" +
                " join MonsterLocation" +
                " on Monster.Id = MonsterLocation.FkMonsterId",
                (Monster, Location) =>
                {
                    Monster.Location = new List<MonsterLocationDatabase>();
                    Monster.Location.Add(Location);
                    return Monster;
                }, splitOn: "SplitMonster"
                ).FirstOrDefault();
            return Monster;
        }
    }

【问题讨论】:

  • .FirstOrDefault 返回一个结果
  • @BarışCanYılmaz 是的,但我只想要 1 个结果,其中 List 内部填充了多个对象。如果我这样做了
  • splitOn: "SplitMonster" 没有意义,因为该列不会更改。它必须是从一个子对象更改为下一个子对象的列。你也有select top 1 无论如何只会返回一行
  • 您的某些代码在这里没有意义:您声明了var Monster = ...,但这似乎是传递给GetMonster 方法的monster 变量的类型。跨度>

标签: c# dapper


【解决方案1】:

我能够通过遵循一对多的简洁文档来解决这个问题 https://dapper-tutorial.net/result-multi-mapping

  public static MonsterDatabase GetMonster()
    {
        using (var connection = new SqlConnection(config["appsettings:RagnaDatabase"]))
        {
            var monsterDictionary = new Dictionary<int, MonsterDatabase>();
            var Monster = connection.Query<MonsterDatabase, MonsterLocationDatabase, MonsterDatabase>(
                "select top 10 Monster.*, SplitMonster = '', MonsterLocation.*" +
                " from Monster" +
                " left join MonsterLocation" +
                " on Monster.Id = MonsterLocation.FkMonsterId",
                (Monster, Location) =>
                {
                    MonsterDatabase monsterEntry;
                    if(!monsterDictionary.TryGetValue(Monster.Id, out monsterEntry))
                    {
                        monsterEntry = Monster;
                        monsterEntry.Location = new List<MonsterLocationDatabase>();
                        monsterDictionary.Add(monsterEntry.Id, monsterEntry);
                    }
                    monsterEntry.Location.Add(Location);
                    return monsterEntry;
                }, splitOn: "SplitMonster"
                ).Distinct().FirstOrDefault();
            return Monster;
        }
    }

【讨论】:

    猜你喜欢
    • 2018-03-27
    • 1970-01-01
    • 2018-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-24
    • 1970-01-01
    相关资源
    最近更新 更多