2012-12-06 1 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

'(IDictionary 로 d). 키는 null을 반환합니다. 어쩌면 나는이 모든 것이 WCF에서 일어나고 있다고 언급 했어야했는데, 이것이 어떤 차이를 만들지는 모르겠다. – Dmitry

+1

이 솔루션은 정기적으로 작동 할 것이라고 생각하지만 차이점은이 동적 d 변수가 PetaPoco를 통해 데이터베이스에서 제공된다는 것입니다. – Dmitry

+0

차이를 만들어서는 안됩니다. type 매개 변수로 dynamic을 넣을 때 ExpandoObject를 반환합니다. – Schotime

1

, 당신은 사용할 수 있습니다

result.First().Keys.ToDictionary(k => k, k => result.Select(r => r[k].ToString()).ToList()); 
: 당신이 Dictionary<string, List<string>>에이 변환하려면

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

이와 그 후속 결과 카운트를 확인한 후

.