PetaPoco - 动态类型的属性名称

时间:2012-12-06 20:07:18

标签: c# dynamic reflection 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();

为什么我没有获得我期望的属性的任何想法?

3 个答案:

答案 0 :(得分: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());
检查结果计数后

答案 1 :(得分:0)

单次返回ExpandoObject。

您可以使用以下命令从查询中获取名称:

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

答案 2 :(得分: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;