2015-05-01 80 views
8

我想用Dapper.NET(EmergingIssue包含Reason和Status對象)將一個扁平結果集返回到嵌套對象,但查詢沒有填充所有列。見下面波蘇斯:小巧的嵌套對象查詢 - 不填充所有屬性

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")(以及其他類似的,簡單的)功能,但我並不經常像上面嘗試的那樣傳遞函數。

+1

這是因爲您在select語句中的列排序與splitOn不同,所以Dapper返回null。 –

回答

7

的問題是在這裏:

splitOn: "ReasonID, StatusID"

您不能添加splitOn字符串中的任何空格作爲小巧玲瓏的簡單拆分此字符串由逗號 - 它會尋找一個名爲" StatusId"列(在一個空間開始)

+0

我已經設法通過結合您和@Matija提供的答案來解決問題。主要問題是SplitOn基於拆分數據將對象分塊,並且列順序不正確。我用新的SQL更新了原始問題。 – TimeBomb006