18

我正在使用 Rob Conery 的 Massive ORM,但我无法将结果绑定ExpandoObjectGridView.

我确实发现了另一个 Stackoverflow 问题,该问题建议使用名为 impromptu 的框架,但我不确定这是否适用。如果您知道,请提供代码示例以实际将 an 转换ExpandoObjectGridView控件可以绑定的内容。

最坏的情况,是否有人为 Massive 实现了一种附加方法(可以共享)以将结果转换ExpandoObject为 POCO?

任何帮助是极大的赞赏。谢谢。

4

7 回答 7

52

由于无法绑定到 ExpandoObject,因此可以将数据转换为 DataTable。此扩展方法将为您做到这一点。我可能会将其提交给 Massive。

/// <summary>
/// Extension method to convert dynamic data to a DataTable. Useful for databinding.
/// </summary>
/// <param name="items"></param>
/// <returns>A DataTable with the copied dynamic data.</returns>
public static DataTable ToDataTable(this IEnumerable<dynamic> items) {
    var data = items.ToArray();
    if (data.Count() == 0) return null;

    var dt = new DataTable();
    foreach(var key in ((IDictionary<string, object>)data[0]).Keys) {
        dt.Columns.Add(key);
    }
    foreach (var d in data) {
        dt.Rows.Add(((IDictionary<string, object>)d).Values.ToArray());
    }
    return dt;
}
于 2011-06-09T20:14:12.167 回答
2

如果我们在谈论 GridView(意思是不是 WPF),那么impromptu可以将扩展代理代理到给定接口的 poco。假设我们有一个 expando 列表,您可以将它们转换为 poco:

IEnumerable<IMyInterface> listOfPocos
       = Impropmtu.AllActLike<IMyInterface>(listOfExpandos, typeof(INotifyPropertyChanged));
于 2011-06-20T13:48:59.417 回答
2

我改编了布赖恩接受的答案,使其更加简洁和 LINQ-y:

public static DataTable ToDataTable(this IEnumerable<dynamic> items)
{
    var list = items.Cast<IDictionary<string, object>>().ToList();
    if(!list.Any()) return null;

    var table = new DataTable();
    list.First().Keys.Each(x => table.Columns.Add(x));
    list.Each(x => x.Values.Each(y => table.Rows.Add(y)));

    return table;
}

(这假设您已经定义了一个 IEnumerable.Each 扩展,我工作过的每个代码库都有)。

于 2013-06-05T22:00:56.030 回答
1

在研究了同一主题后,我来到了这个主题,我没有找到解决方案,而是构建了自己的解决方案,因为我非常需要这个。所以这是我的解决方案,而不需要真正有效的 POCO。

// Fill "list" with your dynamic objects.

// cast a dynamic object to dictionary so we get the properties from it.
var props = list[0] as IDictionary<string, object>;

// create a datatable 
var table = new System.Data.DataTable();
    foreach (var c in props.Keys)
        table.Columns.Add(new DataColumn(c));

foreach (var o in list)
{
    var row = table.NewRow();
    var op =  o as IDictionary<string, object>;
    foreach (var p in op.Keys)
    {
        row[p] = op[p];
    }
    table.Rows.Add(row);
}

只需将此表绑定到您的网格!

我测试了它,它对我有用。

于 2013-12-21T18:42:59.917 回答
0

好的,显然到目前为止,您只是无法将 GridView 控件绑定到 ExpandoObject 实例。我不得不使用反射将 ExpandoObject 转换为 POCO 类。

于 2011-04-11T01:39:04.863 回答
0

改编自本的回答

 public static DataTable ToDataTable(this IEnumerable<dynamic> items)
    {
        if (!items.Any()) return null;

        var table = new DataTable();
        bool isFirst = true;

        items.Cast<IDictionary<string, object>>().ToList().ForEach(x =>
        {
            if (isFirst) 
              {
                x.Keys.Select(y => table.Columns.Add(y)).ToList();
                isFirst = false;
              }
            table.Rows.Add(x.Values.ToArray());
        });

        return table;
    }
于 2015-09-03T08:49:35.283 回答
0
/// <summary>
/// Extension method to convert dynamic data to a DataTable. Useful for databinding.
/// </summary>
/// <param name="items"></param>
/// <returns>A DataTable with the copied dynamic data.</returns>
public static DataTable ToDataTable(this IEnumerable<dynamic> items)
{
    var data = items.ToArray();
    if (data.Count() == 0) return null;

    var dt = new DataTable();
    foreach (var pair in ((IDictionary<string, object>)data[0]))
    {
        dt.Columns.Add(pair.Key, pair.Value.GetType());
    }


    foreach (var d in data)
    {
        dt.Rows.Add(((IDictionary<string, object>)d).Values.ToArray());
    }
    return dt;
}
于 2021-08-10T15:51:28.600 回答