Запрос вложенного объекта Dapper - не заполняет все свойства

Я пытаюсь вернуть плоский результирующий набор во вложенный объект с помощью Dapper.NET (EmergingIssue содержит объекты Reason и Status), но запрос не заполняет все столбцы. См. POCOs ниже:

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") (и другие подобные, простые) функции, например, но я не часто передаю функции, как я пытаюсь выше.

2 ответов


проблема:

splitOn: "ReasonID, StatusID"

вы не можете добавить пробелы внутри splitOn string поскольку Dapper просто разбивает эту строку запятыми - он будет искать столбец с именем " StatusId" (с пробелом в начале)


вместо создания запросов с помощью StringBuilder, Почему бы вам не попробовать использовать SqlBuilder класса. Это предоставит вам более читаемое создание запроса с моей точки зрения.

Я также узнал, что этот парень, создать большое расширение. https://github.com/ronnieoverby/UniqueNamespace.SqlBuilder