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;