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();

Любые идеи, почему я не получаю свойства, которые я ожидаю?


person Dmitry Efimenko    schedule 06.12.2012    source источник


Ответы (3)


Если вас устраивает список словарей, вы можете использовать:

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());

после проверки подсчета результатов.

person Sam    schedule 22.03.2013

Единый возврат ExpandoObject.

Вы можете получить имена из запроса, используя:

(d as IDictionary<String, object>).Keys
List<string> names = (d as IDictionary<String, object>).Keys.ToList();
person Michael Pakhantsov    schedule 07.12.2012
comment
(d as IDictionary<String, object>).Keys возвращает ноль. Возможно, мне следовало упомянуть, что все это происходит в WCF, но я не думаю, что это имеет какое-то значение. - person Dmitry Efimenko; 08.12.2012
comment
Я думаю, что это решение будет работать регулярно, но разница в том, что эта переменная dynamic d поступает из базы данных через PetaPoco. - person Dmitry Efimenko; 08.12.2012
comment
Не должно иметь значения. Он возвращает ExpandoObject, когда вы указываете dynamic в качестве параметра типа. - person Schotime; 09.12.2012
comment
вы тестировали свое решение? Фраза не должна иметь значения, она звучит так, как будто вы этого не сделали. - person Dmitry Efimenko; 27.12.2012
comment
@ Дмитрий, в своем вопросе вы использовали Single‹T› вместо Query‹T›. ;-) - person Michael Pakhantsov; 27.12.2012

Поскольку никто не смог дать рабочий ответ, я опубликую решение, с помощью которого мне удалось это исправить.

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;
person Dmitry Efimenko    schedule 27.12.2012