Requête d'objet imbriquée Dapper - ne pas remplir toutes les propriétés

c# dapper linq

Question

J'essaie de retourner un jeu de résultats plat dans un objet imbriqué avec Dapper.NET (EmergingIssue contient à la fois des objets Reason et Status), mais la requête ne remplit pas toutes les colonnes. Voir POCO ci-dessous:

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

Voici le code où j'essaie de projeter le jeu de résultats dans ma classe EmergingIssue (adoptée à partir d'une question StackOverflow similaire):

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

Ce résultat renvoie plusieurs champs, mais UserComment, PlannerID, DateItemAdded et plusieurs autres champs ne sont pas renseignés. Il semble évident que le problème réside dans la fonction Linq qui projette les données, mais je ne connais pas suffisamment la syntaxe pour comprendre comment la résoudre.

En outre, existe-t-il une ressource Linq utile pour en savoir plus sur les fonctionnalités plus avancées? J'utilise souvent .Where(x => x.StringValue == "Test") (et d'autres fonctionnalités similaires), par exemple, mais je ne passe pas souvent des fonctions comme celles que je tente ci-dessus.

Réponse acceptée

Le problème est ici:

splitOn: "ReasonID, StatusID"

Vous ne pouvez pas ajouter d'espaces blancs à l'intérieur de la chaîne splitOn car le Dapper divise simplement cette chaîne par des virgules - il recherchera une colonne nommée " StatusId" (avec un espace au début)


Réponse populaire

Au lieu de créer une requête à l'aide de StringBuilder , pourquoi ne pas essayer d'utiliser la classe SqlBuilder . Il vous fournira une création de requête plus lisible de mon point de vue.

Je découvre aussi que ce gars-là en crée une grande extension. https://github.com/ronnieoverby/UniqueNamespace.SqlBuilder




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi