У меня есть несколько объектов, которые реализуют этот интерфейс:
public interface IRow
{
void Fill(DataRow dr);
}
Обычно, когда я выбираю что-то из БД, я иду:
public IEnumerable<IRow> SelectSomeRows
{
DataTable table = GetTableFromDatabase();
foreach (DataRow dr in table.Rows)
{
IRow row = new MySQLRow(); // Disregard the MySQLRow type, it's not important
row.Fill(dr);
yield return row;
}
}
Теперь с .Net 4 я бы хотел использовать AsParallel и, следовательно, LINQ.
Я провел некоторое тестирование на нем, и это сильно ускоряет процесс (IRow.Fill использует Reflection, поэтому он сильно загружает процессор)
В любом случае, моя проблема в том, как мне создать запрос LINQ, который вызывает Fills как часть запроса, поэтому он правильно распараллелен?
Для тестирования производительности я создал конструктор, который использовал DataRow в качестве аргумента, однако я бы действительно очень хотел бы избежать этого, если это возможно.
С конструктором на месте все достаточно просто:
public IEnumerable<IRow> SelectSomeRowsParallel
{
DataTable table = GetTableFromDatabase();
return from DataRow dr in table.Rows.AsParallel()
select new MySQLRow(dr);
}
Однако, как я уже сказал, я бы очень хотел иметь возможность просто вставить свой метод Fill в запрос LINQ и, следовательно, не нуждаться в перегрузке конструктора.