C# 如何使用dapper将多对多关系映射到列表

C# 如何使用dapper将多对多关系映射到列表,c#,oracle,dapper,C#,Oracle,Dapper,我有一个课堂规则 public class AnalysisRule { public long Id { get; set; } public Analysis Analysis { get; set; } public AnalysisCategory AnalysisCategory { get; set; } public Gender Gender { get; set; } public bool FatherHerdBookRequired

我有一个课堂规则

public class AnalysisRule
{
    public long Id { get; set; }
    public Analysis Analysis { get; set; }
    public AnalysisCategory AnalysisCategory { get; set; }
    public Gender Gender { get; set; }
    public bool FatherHerdBookRequired { get; set; }
    public bool MotherHerdBookRequired { get; set; }
    public List<Breed> AllowedBreeds { get; set; }
}
这是一个多对多关系,我用DB表绑定在一起 分析规则种子

繁殖

和分析规则

我已经试过了

    var sql = @"select *
                from ""AnalysisRules"" 
                join ""AnalysisCategory"" on ""AnalysisRules"".""AnalysisCategoryId"" = ""AnalysisCategory"".""Id""  
                join ""Analysis"" on ""AnalysisRules"".""AnalysisId"" = ""Analysis"".""Id""
                left join ""AnalysisRulesBreeds"" on ""AnalysisRulesBreeds"".""AnalysisRuleId"" = ""AnalysisRules"".""Id""
                left join ""Breed"" on ""AnalysisRulesBreeds"".""BreedId"" = ""Breed"".""BreedId""
                where ""AnalysisId"" = :AnalysisId";
    rules = sqlConnection.QueryAsync<AnalysisRule, AnalysisCategory, Analysis, Breed, AnalysisRule>(
        sql,
        (ar, c, a, b) =>
        {
            ar.AnalysisCategory = c;
            ar.Analysis = a;
            ar.Breeds.Add(b);
            return ar;
        },
        new
        {
            AnalysisId = analysisId
        },
        splitOn:"BreedId");
var sql=@“选择*
来自“分析规则”
在“AnalysisRules”“AnalysisCategoryId”“AnalysisCategory”“Id”“上加入“AnalysisCategory”
在“分析规则”上加入“分析”。“分析Id”=“分析”。“Id”
在“AnalysisRulesReeds”上左联接“AnalysisRulesReeds”。“AnalysisRuleId”=“AnalysisRules”。“Id”
在“AnalysisRulesReeds”“BreedId”“=”“BreedId”“”“BreedId”“上左键联接”“BreedId”“。”
其中“AnalysisId=:AnalysisId”;

rules=sqlConnection.QueryAsync

通过选择*可以获得每个联接表的列。您还将
splitOn
设置为
BreedId
。现在Dapper希望将一个联接表的行列与下一个联接表的行列分开,它应该查找名为
BreedId
的列

这不起作用,因为除
AnalysisRulesBreeds
之外的所有表都使用
Id
作为Id列名

尝试删除
splitOn
参数,然后它将默认为
Id
。然后调整select子句,只从结果中实际需要的表中进行选择,例如

选择分析规则。*,分析类别。*,分析。*,品种。*


(假设您的分析表和AnalysisCategory表遵循将Id列命名为“Id”的约定)。

已尝试根据您的建议进行编辑,但我仍然收到相同的错误,即使我仅在所有表中使用Id作为PK,请参阅编辑部分,以获取我在SQLDevice中获得的数据的屏幕截图。如果Dapper接收的结果包含屏幕转储中显示的id列名(id、id_1、id_2),则它将不起作用。神谕的事?SQL Server中的同一查询会将id列命名为id、id和id…然后我是否可以将每个列显式命名为“AnalysisCategoryId”并以某种方式进行拆分?是的,应该可以向拆分添加逗号分隔的列表,例如“AnalysisCategoryId,BreedId,…”。
    var sql = @"select *
                from ""AnalysisRules"" 
                join ""AnalysisCategory"" on ""AnalysisRules"".""AnalysisCategoryId"" = ""AnalysisCategory"".""Id""  
                join ""Analysis"" on ""AnalysisRules"".""AnalysisId"" = ""Analysis"".""Id""
                left join ""AnalysisRulesBreeds"" on ""AnalysisRulesBreeds"".""AnalysisRuleId"" = ""AnalysisRules"".""Id""
                left join ""Breed"" on ""AnalysisRulesBreeds"".""BreedId"" = ""Breed"".""BreedId""
                where ""AnalysisId"" = :AnalysisId";
    rules = sqlConnection.QueryAsync<AnalysisRule, AnalysisCategory, Analysis, Breed, AnalysisRule>(
        sql,
        (ar, c, a, b) =>
        {
            ar.AnalysisCategory = c;
            ar.Analysis = a;
            ar.Breeds.Add(b);
            return ar;
        },
        new
        {
            AnalysisId = analysisId
        },
        splitOn:"BreedId");
                    sqlConnection.Open();

                var sql = @"select  ar.*,
                                    ac.*,
                                    b.*                 

                            from ""AnalysisRules"" ar
                            join ""AnalysisCategory"" ac on ar.""AnalysisCategoryId"" = ac.""Id""  
                            join ""Analysis"" a on ar.""AnalysisId"" = a.""Id""

                            left join ""AnalysisRulesBreeds""  on ""AnalysisRulesBreeds"".""AnalysisRuleId"" = ar.""Id""
                            left join ""Breed"" b  on ""AnalysisRulesBreeds"".""BreedId"" = b.""Id""

                            where ""AnalysisId"" = :AnalysisId";

                var rules = sqlConnection.QueryAsync<AnalysisRule, AnalysisCategory, Analysis, Breed, AnalysisRule>(
                    sql,
                    (ar, c, a, b) =>
                    {
                        ar.AnalysisCategory = c;
                        ar.Analysis = a;
                        ar.Breeds.Add(b);
                        return ar;
                    },
                    new
                    {
                        AnalysisId = analysisId
                    });

                return await rules;