Вернуть типизированный DataTable из Linq Query - PullRequest
2 голосов
/ 27 июня 2009

У меня есть (отключенный) типизированный набор данных в 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 Ответ

2 голосов
/ 27 июня 2009

Ну, 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>();

Обратите внимание, что я не тестировал этот код, возможно, есть несколько ошибок ...

...