얼마나 많은 관계를 목록으로 매핑 할 것인가?

c# dapper oracle

문제

나는 클래스 AnalysisRule있다.

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

그것에는 유형의 명부가있다

public class Breed
{
    public long BreedId { get; set; }
    public long AnimalTypeId { get; set; }
    public long BreedCode { get; set; }
    public string BreedName { get; set; }
    public string BreedAcronym { get; set; }
}

이것은 DB 테이블과 함께 바인딩하는 다 대다 관계입니다. AnalysisRulesBreeds 여기에 이미지 설명을 입력하십시오.

품종

여기에 이미지 설명을 입력하십시오.

그리고 AnalysisRules 여기에 이미지 설명을 입력하십시오.

Dapper와 함께 시도했습니다.

    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");

어느 것이 나를 준다.

다중 매핑 API를 사용할 때 Id가 아닌 키가 있으면 splitOn 매개 변수를 설정하십시오. 매개 변수 이름 : splitOn

SQL Developer에서 동일한 쿼리를 실행하면 동일한 ID로 2 행을 얻지 만 Breed에서 다른 데이터를 사용하므로 쿼리가 충분해야합니다.

그렇다면이 두 행을 Breed가 2 개의 Breed 엔티티로 구성된 하나의 AnalysisRule 엔티티로 가져 오는 방법은 무엇입니까?

편집 해주세요.

                    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;

splitOn을 제거하고 AnalysisRulesBreedsId를 Id로 변경했지만 여전히 얻을 수 있습니다.

다중 매핑 API를 사용할 때 Id가 아닌 키가 있으면 splitOn 매개 변수를 설정하십시오. 매개 변수 이름 : splitOn

SQLDev에서 동일한 쿼리를 수행하면 여기에 이미지 설명을 입력하십시오.

인기 답변

*를 선택하면 모든 조인 된 테이블의 열을 가져옵니다. 또한 splitOnBreedId 설정합니다. 이제 Dapper는 조인 된 테이블의 행 열을 다음 테이블과 분리하기 위해 BreedId 라는 열을 BreedId 합니다.

이는 AnalysisRulesBreeds 제외한 모든 테이블이 Id 를 ID 열 이름으로 사용하기 때문에 작동하지 않습니다.

splitOn 매개 변수를 제거해보십시오. 그러면 기본적으로 Id 됩니다. 그런 다음 select 절을 조정하여 결과에서 실제로 필요한 테이블 중에서 선택하십시오 (예 :

select AnalysisRule.*, AnalysisCategory.*, Analysis.*, Breed.*

(Analysis 테이블과 AnalysisCategory 테이블이 Â'Id '라는 Id 열을 갖는 규칙을 따른다고 가정).



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow