从Linq Query返回类型化的DataTable

时间:2009-06-27 18:58:55

标签: .net linq dataset

我在XML中有一个(断开连接的)类型化数据集,我在LINQ中查询:

var productlist = from prds in dsProducts.Products.AsEnumerable()
where (prds.Field<string>("productid").Contains(searchpattern) || 
       prds.Field<string>("productname").Contains(searchpattern))
select prds;

这个清单很好,但如果我试着说:

return (DataSetProducts.productsDataTable)productlist.Skip(begin).Take(pagesize).CopyToDataTable();

它说它无法将System.DataTable转换为DataSetProducts.productsDataTable,但它是同一个表。

有关如何返回类型化DataTable的想法吗?

1 个答案:

答案 0 :(得分:2)

好吧,CopyToDataTable无法知道给定类型DataTable的正确强DataRow类型是什么,因为DataRow没有提供该信息(这是一个耻辱恕我直言。)

也许您可以编写自己的CopyToDataTable方法,该方法将使用另一个类型参数来指定表类型。这样的事情:

public static TTable CopyToDataTable<TRow, TTable>(this IEnumerable<TRow> rows)
  where TRow : DataRow, new()
  where TTable : DataTable, new()
{
    TTable table = new TTable();
    foreach (TRow row in rows)
    {
        TRow rowCopy = new TRow();
        object[] itemArrayCopy = new object[row.ItemArray.Length];
        row.ItemArray.CopyTo(itemArrayCopy, 0);
        rowCopy.ItemArray = itemArrayCopy;
        table.Rows.Add(rowCopy);
    }
    return table;
}

编辑:

  

如何在上面的例子中使用这个新函数?

您必须将此扩展方法放在静态类中。如果将该类放在不同的名称空间中,请确保使用using子句在作用域中导入该名称空间。

然后您可以使用这样的方法(您必须指定类型参数,因为编译器无法推断出TTable类型):

return productlist.Skip(begin).Take(pagesize).CopyToDataTable<DataSetProducts.productsRow, DataSetProducts.productsDataTable>();

请注意,我没有测试此代码,可能存在一些错误......