2015-05-01 16 views
8

Tôi đang cố gắng trả lại kết quả bằng phẳng được đặt thành đối tượng lồng nhau với Dapper.NET (EmergingIssue chứa cả đối tượng Lý do và Trạng thái), nhưng truy vấn không điền tất cả các cột. Xem POCOs dưới đây:Dapper truy vấn đối tượng lồng nhau - không điền tất cả các thuộc tính

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

Dưới đây là đoạn code mà tôi đang cố gắng để dự kiến ​​kết quả thiết lập để lớp học của tôi EmergingIssue (thông qua từ một câu hỏi StackOverflow tương tự):

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

Kết quả này đang trở lại một vài trường, nhưng người dùng, PlannerID, DateItemAdded và một số trường khác không được điền. Có vẻ như rõ ràng là vấn đề nằm trong hàm LINQ đang chiếu dữ liệu, nhưng tôi không đủ quen thuộc với cú pháp để hiểu cách giải quyết nó.

Hơn nữa, có một tài nguyên Linq có giá trị để tìm hiểu về chức năng nâng cao hơn không? Tôi thường xuyên sử dụng chức năng .Where(x => x.StringValue == "Test") (và các chức năng tương tự, đơn giản) khác, nhưng tôi không thường xuyên chuyển các chức năng như tôi đang cố gắng ở trên.

+1

Đó là do thứ tự cột của bạn trong câu lệnh chọn không giống như splitOn nên Dapper trả về giá trị rỗng. –

Trả lời

7

Vấn đề là ở đây:

splitOn: "ReasonID, StatusID"

Bạn không thể thêm bất kỳ khoảng trắng bên trong splitOn chuỗi như Dapper chỉ đơn giản là tách chuỗi này bằng dấu phẩy - nó sẽ tìm kiếm một cột tên là " StatusId" (với một không gian trong đầu)

+0

Tôi đã cố gắng giải quyết vấn đề bằng cách kết hợp các câu trả lời được cung cấp bởi bạn và @Matija Vấn đề chính là SplitOn đã chunking các đối tượng với nhau dựa trên dữ liệu phân chia và thứ tự cột không chính xác. Tôi đã cập nhật câu hỏi ban đầu với SQL mới. – TimeBomb006

1

Thay vì tạo truy vấn bằng cách sử dụng StringBuilder, tại sao bạn không thử sử dụng lớp SqlBuilder. Nó sẽ cung cấp cho bạn khả năng tạo truy vấn dễ đọc hơn theo quan điểm của tôi.

Tôi cũng tìm ra rằng anh chàng này, tạo ra một phần mở rộng tuyệt vời của nó. https://github.com/ronnieoverby/UniqueNamespace.SqlBuilder

Các vấn đề liên quan