Ваша проблема заключается в следующем:
as IEnumerable<DataRow>
Ключевое слово as
выполняет безопасное приведение, а не преобразование, что, как вам кажется, может показаться. Ключевое слово as
семантически аналогично тому, как это делается:
IEnumerable<DataRow> queryProjects =
(IEnumerable<DataRow>)(from DataRow p in db.STREAM_PROJECTs.AsEnumerable()
where p.Field<int>("STREAM_ID") == StreamID
select new
{
PROJECT_ID = p.Field<int>("PROJECT_ID"),
PROJECT_NAME = p.Field<int>("PROJECT_NAME")
});
За исключением того, что версия с as
не будет выдавать исключение, если не удается привести ваш объект запроса (который является IQueryable<T>
, где T
является анонимным типом) в IEnumerable<DataRow>
(который не «т).
К сожалению, я не знаю встроенного метода, который бы использовал перечислимый конкретный тип (например, ваш анонимный тип в этом примере) и превратил его в DataTable
. Написание одного не было бы слишком сложным, так как вам, по сути, нужно рефлексивно получить свойства, а затем выполнить итерацию по коллекции и использовать эти свойства для создания столбцов в DataTable
. Я приведу пример в нескольких.
Что-то вроде этого, помещенное в статический класс в пространстве имен, которое вы using
, должно предоставить метод расширения, который будет делать то, что вы хотите:
public static DataTable ToDataTable<T>(this IEnumerable<T> source)
{
PropertyInfo[] properties = typeof(T).GetProperties();
DataTable output = new DataTable();
foreach(var prop in properties)
{
output.Columns.Add(prop.Name, prop.PropertyType);
}
foreach(var item in source)
{
DataRow row = output.NewRow();
foreach(var prop in properties)
{
row[prop.Name] = prop.GetValue(item, null);
}
output.Rows.Add(row);
}
return output;
}