2012-12-06 88 views
1

我試圖從數據庫動態類型返回返回屬性的名稱屬性名稱:PetaPoco從動態類型

var d = mDataAccess.Single<dynamic>("select col1 = 'asd', col2 = 'qwe'"); 
object o = d; 
var props = o.GetType().GetProperties(); 
int propsCount = props.Count(); 

的propsCount是0,但是我希望有2個, 在這種情況下,下面的代碼將返回給我兩個名字:col1和col2

List<string> names = o.GetType().GetProperties().Select(x => x.Name).ToList(); 

任何想法爲什麼我沒有得到我期望的屬性?

回答

0

既然沒有人能夠提供一個工作的答案,我會後,我才得以繼續解決這個問題的解決方案。

var e = new Dictionary<string, List<string>>(); 

Sql sql = new Sql("select col1 = 'asd', col2 = 'qwe'"); 
var d = mDataAccess.Query<dynamic>(sql); 

if (d != null && d.Count() > 0) 
{ 
    List<string> cols = new List<string>(); 
    foreach (var t in d.First()) 
    { 
     cols.Add(t.Key); 
    } 

    foreach (var key in cols) 
    { 
     List<string> values = new List<string>(); 
     foreach (var row in d) 
     { 
      foreach (var t in row) 
      { 
       if (t.Key == key) values.Add(t.Value.ToString()); 
      } 
     } 
     e.Add(key, values); 
    } 
} 

return e; 
0

單返回ExpandoObject。

您可以通過使用得到的查詢名稱:

(d as IDictionary<String, object>).Keys 
List<string> names = (d as IDictionary<String, object>).Keys.ToList(); 
+0

'(d as IDictionary )。Keys'返回null。也許我應該提到所有這些都發生在WCF中,但我認爲這沒有什麼區別。 – Dmitry

+1

我在想這個解決方案會經常工作,但是區別在於這個'dynamic d'變量是通過PetaPoco來自數據庫的。 – Dmitry

+0

不應該有所作爲。當您將dynamic作爲類型參數時,它將返回ExpandoObject。 – Schotime

1

如果你滿意的詞典列表,你可以使用:

var results = database.Fetch<dynamic>(sql).Cast<IDictionary<string, object>>().ToList(); 

如果你想變成一個Dictionary<string, List<string>>此,請執行了:

result.First().Keys.ToDictionary(k => k, k => result.Select(r => r[k].ToString()).ToList()); 
檢查結果數後檢查