Dapper 중첩 객체 쿼리 - 모든 속성을 채우지 않음

c# dapper linq

문제

Dapper.NET (EmergingIssue에는 Reason 및 Status 개체가 모두 포함되어 있음)로 중첩 된 개체로 플랫 결과 집합을 반환하려고하지만 쿼리가 모든 열을 채우지 않습니다. 아래의 POCO를 참조하십시오.

public class EmergingIssue
{
    public string Category;
    public string Brand;
    public string Sku;
    public string SkuDesc;
    public string ManufacturingSite;
    public double? CurrentAvailableWfc;
    public Reason Reason;
    public Status Status;
    public double? TargetWfc;
    public DateTime? DateItemAdded;
    public string UserComment;
    public string PlannerID;
}

public class Reason
{
    public int ReasonId;
    public string ReasonDesc;
}

public class Status
{
    public int StatusId;
    public string StatusDesc;
}

아래는 내가 비슷한 결과를 내 EmergingIssue 클래스 (비슷한 StackOverflow 질문에서 채택)에 투영하려고 시도하는 코드입니다 :

public static List<EmergingIssue> GetEmergingIssues()
{
    using (var conn = new OracleConnection(Constant.DatabaseConnection()))
    {
        conn.Open();
        StringBuilder sql = new StringBuilder();

        sql.Append("SELECT ei.CATEGORY, ei.BRAND, ei.SKU, ei.SKU_DESC SkuDesc");
        sql.Append(" ,MANUFACTURING_SITE ManufacturingSite, CURRENT_AVAILABLE_WFC CurrentAvailableWfc");
        sql.Append(" ,ei.TARGET_WFC TargetWFC");
        sql.Append(" ,ei.DATE_ITEM_ADDED DateItemAdded");
        sql.Append(" ,ei.USER_COMMENT UserComment");
        sql.Append(" ,ei.PLANNER_ID PlannerID");
        sql.Append(" ,ei.REASON_ID ReasonID, r.REASON_DESC ReasonDesc");
        sql.Append(" ,ei.STATUS_ID StatusID, s.STATUS_DESC StatusDesc");
        sql.Append(" FROM EMERGING_ISSUE ei");
        sql.Append(" LEFT OUTER JOIN EMERGING_ISSUE_STATUS s ON s.STATUS_ID = ei.STATUS_ID");
        sql.Append(" LEFT OUTER JOIN MERGING_ISSUE_REASON r ON r.REASON_ID = ei.REASON_ID");

        List<EmergingIssue> emergingIssues = conn.Query<EmergingIssue, Reason, Status, EmergingIssue>(sql.ToString(),
            (ei, r, s) =>
            {
                ei.Reason = r;
                ei.Status = s;
                return ei;
            },
            splitOn: "ReasonID, StatusID").ToList();

        return emergingIssues;
    }
}

이 결과는 여러 필드를 반환하지만 UserComment, PlannerID, DateItemAdded 및 다른 여러 필드는 채워지지 않습니다. 데이터가 예상되는 Linq 함수에 문제가 있음을 분명히 알 수 있지만이를 해결하는 방법을 이해하기 위해서는 구문에 익숙하지 않습니다.

또한, 더 고급 기능에 대해 배울 수있는 가치있는 Linq 리소스가 있습니까? 나는 자주 사용한다. .Where(x => x.StringValue == "Test") (예를 들어 다른 유사한, 간단한) 기능을 자주 사용한다. 그러나 나는 위에서 시도한 것처럼 자주 함수를 전달하지 않는다.

수락 된 답변

문제는 다음과 같습니다.

splitOn: "ReasonID, StatusID"

Dapper는이 문자열을 쉼표로 단순히 분할하므로 splitOn 문자열 안에 공백을 추가 할 수 없습니다. " StatusId" 라는 열을 찾습니다 (처음에는 공백이 있음)


인기 답변

StringBuilder 를 사용하여 쿼리를 만드는 대신 SqlBuilder 클래스를 사용해보십시오. 그것은 내 관점에서보다 읽기 쉬운 쿼리 생성을 제공 할 것입니다.

나는 또한이 녀석이 그것의 큰 연장을 창조한다는 것을 알아 낸다. https://github.com/ronnieoverby/UniqueNamespace.SqlBuilder



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.