我有一个作为 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.值;
提前感谢您提供的任何观点或有用的见解。
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;
}