2015-05-01 12 views
8

Sto cercando di restituire un set di risultati flat in un oggetto nidificato con Dapper.NET (EmergingIssue contiene sia oggetti Reason che Status), ma la query non popola tutte le colonne. Vedere pocos di seguito:Query oggetto nested dapper - non popolamento di tutte le proprietà

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

Di seguito si riporta il codice in cui sto tentando di proiettare il set di risultati per la mia classe EmergingIssue (adottato da una simile domanda 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; 
    } 
} 

Questo risultato sta tornando diversi i campi, ma UserComment, PlannerID, DateItemAdded e molti altri campi non vengono popolati. Sembra ovvio che il problema risieda nella funzione Linq che sta proiettando i dati, ma non ho familiarità con la sintassi per capire come risolverlo.

Inoltre, esiste una preziosa risorsa Linq per l'apprendimento delle funzionalità più avanzate? Io uso spesso la funzionalità .Where(x => x.StringValue == "Test") (e altre simili, semplici), ad esempio, ma non passo spesso le funzioni come sto tentando sopra.

+1

È perché l'ordinamento della colonna nell'istruzione select non è lo stesso di splitOn, quindi Dapper restituisce null. –

risposta

7

Il problema è qui:

splitOn: "ReasonID, StatusID"

non è possibile aggiungere eventuali spazi bianchi all'interno della stringa splitOn come Dapper divide semplicemente questa stringa da virgole - cercherà una colonna denominata " StatusId" (con uno spazio in l'inizio)

+0

Sono riuscito a risolvere il problema combinando le risposte fornite da te e @Matija. Il problema principale è che SplitOn stava raggruppando gli oggetti in base ai dati suddivisi e l'ordine delle colonne non era corretto. Ho aggiornato la domanda originale con il nuovo SQL. – TimeBomb006

1

Invece di creare una query utilizzando StringBuilder, perché non provare a utilizzare la classe SqlBuilder. Ti fornirà una creazione di query più leggibile dal mio punto di vista.

Ho anche scoperto che questo ragazzo, crea una grande estensione di esso. https://github.com/ronnieoverby/UniqueNamespace.SqlBuilder

Problemi correlati