2015-05-01 16 views
8

Dapper.NET (EmergingIssue hem Reason hem de Durum nesneleri içeriyor) ile iç içe bir nesneye ayarlanan düz bir sonuç döndürmeye çalışıyorum, ancak sorgu tüm sütunları doldurmuyor.Dapper iç içe nesne nesnesi - tüm özellikleri gösterme

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

Bu sonuç birçok döndürüyor: Aşağıda

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

Ben (benzer bir StackOverflow soru uyarlanmıştır) benim EmergingIssue sınıfına set sonucu proje çalışılıyor kodudur: Aşağıdaki Pocos görün alanları, ancak UserComment, PlannerID, DateItemAdded ve diğer bazı alanlar doldurulmaz. Sorunun, verileri yansıtan Linq işlevinde yattığı açıktır, ancak nasıl çözüleceğini anlamak için sözdizimine yeterince aşina değilim.

Ayrıca, daha gelişmiş işlevsellik hakkında bilgi edinmek için değerli bir Linq kaynağı var mı? Örneğin, sık sık .Where(x => x.StringValue == "Test") (ve diğer benzer, basit) işlevselliği kullanıyorum, ancak çoğu zaman yukarıda denediğim gibi işlevler iletmiyorum.

+1

Bunun nedeni, select deyiminde sütun sıralamanızın splitOn ile aynı olmaması nedeniyle Dapper null değerini döndürmesidir. –

cevap

7

sorun buradadır: Zarif basitçe virgülle bu dizeyi böler olarak

splitOn: "ReasonID, StatusID"

Sen splitOn dize içinde herhangi boşlukları ekleyemezsiniz - bir boşlukta ile (" StatusId" adında bir sütun için bakacağız başa dön

+0

Sizin ve @Matija tarafından sağlanan yanıtları birleştirerek bu sorunu çözmeyi başardım Ana sorun, SplitOn'un bölünmüş verilere dayanarak birlikte nesneleri topluyor olması ve sütun sırasının yanlış olması. Orijinal soruyu yeni SQL ile güncelledim. – TimeBomb006

1

StringBuilder kullanarak bir sorgu oluşturmak yerine, neden SqlBuilder sınıfını kullanmayı denemiyorsunuz. Benim bakış açımdan size daha fazla okunabilir sorgu oluşturma sağlayacaktır.

Ayrıca bu adamın büyük bir uzantısı oluşturduğunu da öğrendim. https://github.com/ronnieoverby/UniqueNamespace.SqlBuilder

İlgili konular