Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq结果集到数据表_Linq_Datagridview_Datatable_Edmx_Bindingsource - Fatal编程技术网

Linq结果集到数据表

Linq结果集到数据表,linq,datagridview,datatable,edmx,bindingsource,Linq,Datagridview,Datatable,Edmx,Bindingsource,我有一个作为ADO.NET实体数据模型导入的SQL数据库。然后使用Linq填充DataGridView。我用从其他表计算的额外列扩展了其中两个表。例如,我有一个表Orders,其中包含OrderNumber、DateApproved和RequestorID等字段。我还有一个OrderDetails表,其中包含SKU、OrderNUmber和QuanityOrdered等字段。我为Orders表编码了一个新列IsBackOrdered,用于计算OrderDetails中的任何项目(SKU)是否为b

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

当我将表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;
        }
公共静态数据表LINQTODatable(IEnumerable varlist)
{
var dtReturn=新数据表();
//列名
PropertyInfo[]oProps=null;
if(varlist==null)
返回数据返回;
foreach(varlist中的T rec)
{
//使用反射来获取属性名,创建表,只有第一次,其他人会跟随
if(oProps==null)
{
oProps=rec.GetType().GetProperties();
foreach(oProps中的属性信息pi)
{
类型colType=pi.PropertyType;
if((colType.IsGenericType)&&(colType.GetGenericTypeDefinition()==typeof(null)))
{
colType=colType.GetGenericArguments()[0];
}
dtReturn.Columns.Add(新数据列(pi.Name,colType));
}
}
DataRow dr=dtReturn.NewRow();
foreach(oProps中的属性信息pi)
{
dr[pi.Name]=pi.GetValue(rec,null)??DBNull.Value;
}
dtReturn.Rows.Add(dr);
}
返回数据返回;
}

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

感谢您的见解。请原谅我的愚蠢,但您的链接似乎只显示创建BindingList类型的新类。我似乎找不到如何将列表转换为BindingList或构建BindingList linq查询。首先,我很抱歉将您与BindingList建议混淆。我检查了一下,它坏了。我现在看到的最简单的方法是使用您可以找到的通用BindingListView