Linq ResultSet到DataTable

时间:2013-07-02 15:58:15

标签: linq datagridview datatable edmx bindingsource

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

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

我尝试将BindingSource映射到Linq查询,但BindingSource期待一个DataTable。我找到了一个简洁的小方法,将Linq ResultSet转换为DataTable(下面的代码)但是它在我的自定义字段(列)上的barfs: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;
        }

1 个答案:

答案 0 :(得分:0)

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