【问题标题】:Linq ResultSet to DataTableLinq ResultSet 到 DataTable
【发布时间】:2013-07-02 15:58:14
【问题描述】:

我有一个作为 ADO.NET 实体数据模型导入的 SQL 数据库。然后我使用 Linq 填充 DataGridView。我用从其他表计算的额外列扩展了两个表。例如,我有一个表 Orders,其中包含 OrderNumber、DateApproved 和 RequestorID 等字段。我还有一个表是 OrderDetails,其中包含 SKU、OrderNUMber 和 QuanityOrdered 等字段。我为 Orders 表编写了一个新列 IsBackOrdered,用于计算 OrderDetails 中的任何 Item(SKU) 是否延期交货。

当我将表 Orders 绑定到 DataGridView.DataSource 时,一切都按预期工作。然后我被指示为该表创建一个搜索过滤器。

我尝试将 BindingSource 映射到 Linq 查询,但 BindingSource 需要一个 DataTable。我找到了一个巧妙的小方法,可以将 Linq ResultSet 转换为 DataTable(下面的代码),但是它会在我的自定义字段(列)上显示这一行: dr[pi.Name] = pi.GetValue(rec, null) ?? DBNull.Value;

提前感谢您提供的任何观点或有用的见解。

public static DataTable LinqToDataTable<T>(IEnumerable<T> varlist)
        {
            var dtReturn = new DataTable();

            // column names
            PropertyInfo[] oProps = null;

            if (varlist == null)
                return dtReturn;

            foreach (T rec in varlist)
            {
                // Use reflection to get property names, to create table, Only first time, others will follow
                if (oProps == null)
                {
                    oProps = rec.GetType().GetProperties();
                    foreach (PropertyInfo pi in oProps)
                    {
                        Type colType = pi.PropertyType;

                        if ((colType.IsGenericType) && (colType.GetGenericTypeDefinition() == typeof(Nullable<>)))
                        {
                            colType = colType.GetGenericArguments()[0];
                        }

                        dtReturn.Columns.Add(new DataColumn(pi.Name, colType));
                    }
                }

                DataRow dr = dtReturn.NewRow();

                foreach (PropertyInfo pi in oProps)
                {
                    dr[pi.Name] = pi.GetValue(rec, null) ?? DBNull.Value;
                }

                dtReturn.Rows.Add(dr);
            }
            return dtReturn;
        }

【问题讨论】:

    标签: linq datagridview datatable edmx bindingsource


    【解决方案1】:

    BindingSource 的 DataSource 属性不需要 DataTable。它是对象类型,因此您可以使用任何列表作为数据源。但在这种情况下,为了能够过滤它,您应该实现 IBindingListView 或使用 BindingList。第二种情况当然更简单。请查看here 了解更多信息。

    【讨论】:

    • 感谢您的洞察力。请原谅我的愚蠢,但您的链接似乎只显示了创建一个新的 BindingList 类型的类。我似乎找不到如何将列表转换为 BindingList 或构建 BindingList linq 查询。
    • 首先很抱歉让您对 BindingList 建议感到困惑。我检查了它,它不工作。我现在看到的最简单的方法是使用通用的 BindingListView 你可能会发现 here
    猜你喜欢
    • 2012-03-14
    • 1970-01-01
    • 2010-12-28
    • 2010-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-22
    相关资源
    最近更新 更多