2015-05-01 23 views
8

Próbuję zwrócić zestaw wyników płaskich do zagnieżdżonego obiektu za pomocą Dapper.NET (EmergingIssue zawiera oba obiekty Reason i Status), ale zapytanie nie wypełnia wszystkich kolumn. Zobacz Poços poniżej:Zapytanie obiektu zagnieżdżonego Dappera - nie wypełniające wszystkich właściwości

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

Poniżej znajduje się kod, gdzie jestem przystąpieniem do projektu zestaw wyników do mojej klasy EmergingIssue (przyjęta z podobnym pytaniem 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; 
    } 
} 

Wynik ten powraca kilka pola, ale UserComment, PlannerID, DateItemAdded i kilka innych pól nie są wypełnione. Wydaje się oczywiste, że problem leży w funkcji Linq, która wyświetla dane, ale nie jestem dostatecznie zaznajomiony ze składnią, aby zrozumieć, jak rozwiązać ten problem.

Co więcej, czy istnieje cenny zasób Linq do nauki o bardziej zaawansowanych funkcjach? Często używam na przykład funkcji .Where(x => x.StringValue == "Test") (i innych podobnych, prostych), ale często nie przekazuję funkcji, które próbuję wykonać powyżej.

+1

To dlatego, że kolejność kolumn w instrukcji select nie jest taka sama jak splitOn, więc Dapper zwraca wartość null. –

Odpowiedz

7

Problemem jest tutaj:

splitOn: "ReasonID, StatusID"

nie można dodawać żadnych spacje wewnątrz łańcucha splitOn jak Wytworny po prostu dzieli ten ciąg przecinkami - będzie wyglądać na kolumnie o nazwie " StatusId" (z przestrzeni na początku)

+0

Udało mi się rozwiązać problem, łącząc odpowiedzi dostarczone przez Ciebie i @Matija Głównym problemem jest to, że SplitOn dzielił obiekty na podstawie podzielonych danych, a kolejność kolumn była niepoprawna. Zaktualizowałem oryginalne pytanie z nowym SQL. – TimeBomb006

1

Zamiast tworzyć zapytania za pomocą StringBuilder, dlaczego nie spróbujesz użyć klasy SqlBuilder. Zapewni to czytelniejsze tworzenie zapytań z mojego punktu widzenia.

Dowiaduję się również, że ten facet, stwórz wspaniałe przedłużenie tego. https://github.com/ronnieoverby/UniqueNamespace.SqlBuilder

Powiązane problemy