【发布时间】:2016-06-16 12:24:46
【问题描述】:
我创建了一个void method,旨在使用LINQ 查询派生sub - DataTable,我想知道在多次失败后,通过保持DataTable 类型来检索子表的最佳方法。我的主要问题来自implicitly typed 变量sublookup,它检索IEnumerable<T> 类型的对象。到目前为止,任何将IEnumerable<T> 转换回DataTable 的尝试都失败了。
public void subtbl()
{
string LookUpFile;
DataTable LookUpTable = new DataTable();
string[] LookUpDir = RetrieveFileDirectory();
for (int i = 0; i < LookUpDir.Length; i++)
{
LookUpFile =LookUpDir[i];
if (LookUpFile.Contains("Brand"))
{
LookUpTable = ConvertTextFileToDataTable(LookUpFile);
var sublookup = LookUpTable.AsEnumerable()
.Select(x => new { col1 = x["Mac"], col2 = x["Win"],
col3 = x["zo"], col4 = x["dz"], col5 = x["dx"],
col6 = x["zx"] });
}
else
{
Console.WriteLine("\n ... stuck");
Environment.Exit(-1);
}
}
}
作为一种方式,我可以使用很多 DataTable.Columns.Remove("columnname"),但我承认这种方法不是很 efficient,特别是如果父 DataTable 包含大量 columns。
编辑:坚持使用LINQ
的解决方案 var dataRow = LookUpTable.AsEnumerable()
.Select(x => new { col1 = x.Field<string>("Mac"),
col2 = x.Field<string>("Win"),
col3 = x.Field<string>("zo"),
col4 = x.Field<string>("dz"),
col5 = x.Field<string>("dx"),
col6 = x.Field<string>("zx") })
DataTable look = dataRow.CopyToDataTable<DataRow>();
我最终得到错误: System.Data.EnumerableRowCollection<AnonymousType#1> 不包含 CopyToDataTable.... 的定义,尽管在 References 中添加了 System.Data.DataSetExtensions 并且知道 CopyToDataTable()方法用于将IEnumerable<DataRow> 转换回DataTable。
最好的,
【问题讨论】:
-
您必须填写您的
DataTable,例如在一个循环中。但我必须承认我不明白你的要求。匿名类型中的那些属性是您选择的列中您希望在新的DataTable中拥有的吗?所以这个表和原表有不同的架构? -
DataTable已被LookUpTable填充,sub-table是原始表的过滤版本 (caeteris paribus) -
为了清楚起见,主要思想是声明
public DataTabe subtbl()并返回sublookup,但由于无法使用Linq将sub-table保持为DataTable,我切换回到void
标签: c# linq datatable ienumerable