2

我正在尝试返回从数据库动态类型返回的属性名称:

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

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

4

3 回答 3

2

如果您对字典列表感到满意,可以使用:

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

检查结果计数后。

于 2013-03-22T01:32:19.100 回答
0

单返回 ExpandoObject。

您可以使用以下方法从查询中获取名称:

(d as IDictionary<String, object>).Keys
List<string> names = (d as IDictionary<String, object>).Keys.ToList();
于 2012-12-07T10:42:43.230 回答
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;
于 2012-12-27T00:14:37.793 回答