【问题标题】:Create Sub-DataTable using LINQ, and return a DataTable使用 LINQ 创建 Sub-DataTable,并返回一个 DataTable
【发布时间】: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&lt;AnonymousType#1&gt; 不包含 CopyToDataTable.... 的定义,尽管在 References 中添加了 System.Data.DataSetExtensions 并且知道 CopyToDataTable()方法用于将IEnumerable&lt;DataRow&gt; 转换回DataTable

最好的,

【问题讨论】:

  • 您必须填写您的DataTable,例如在一个循环中。但我必须承认我不明白你的要求。匿名类型中的那些属性是您选择的列中您希望在新的DataTable 中拥有的吗?所以这个表和原表有不同的架构?
  • DataTable 已被LookUpTable 填充,sub-table 是原始表的过滤版本 (caeteris paribus)
  • 为了清楚起见,主要思想是声明public DataTabe subtbl()并返回sublookup,但由于无法使用Linqsub-table保持为DataTable,我切换回到void

标签: c# linq datatable ienumerable


【解决方案1】:

我会使用以下方法,不需要和推荐使用 LINQ:

var allSubTables = new List<DataTable>();
string[] relevantColumns = { "Mac", "Win", "zo", "dz", "dx", "zx", };
DataTable lookUpTable = new DataTable();
foreach (string colName in relevantColumns)
    lookUpTable.Columns.Add(colName);

foreach (string t in LookUpDir)
{
    LookUpFile = t;
    if (LookUpFile.Contains("Brand"))
    {
        DataTable textFileTable = ConvertTextFileToDataTable(LookUpFile);
        DataTable subTable = lookUpTable.Clone(); // same columns, empty
        foreach (DataRow row in textFileTable.Rows)
        {
            DataRow addedRow = subTable.Rows.Add(); // already added now
            foreach (DataColumn col in subTable.Columns)
                addedRow.SetField(col.ColumnName, row.Field<string>(col.ColumnName));
        }
        allSubTables.Add(subTable);
    }
    else
    {
        Console.WriteLine("\n ... stuck");
        Environment.Exit(-1);
    }
}

【讨论】:

  • @Tim:感谢您的支持,尽管我仍在寻找编辑后帖子中指出的linq 解决方案。
  • @dark.vador:为什么?永远不要使用 LINQ 来修改某些内容,而是查询某些内容。 DataTables 是不应该用 LINQ 填充的特殊类型。一个原因是每一行或每一列都将它的表存储为参考,每次尝试将其添加到另一个表时,都会出现异常。每个 LINQ 解决方案都比我提供的解决方案效率低,安全性低(例如,使用 CopyToDataTable&lt;Anything&gt;)。 CopyToDataTable 的另一个缺点:如果输入序列为空,则会出现异常。所以你需要两个查询。
  • 不过,如果你坚持的话,这里是链接:msdn.microsoft.com/en-us/library/bb669096(v=vs.110).aspx
  • 好的。谢谢。仅供参考:string[] LookUpDir = RetrieveFileDirectory()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-15
  • 1970-01-01
  • 1970-01-01
  • 2019-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多