j'ai des objets qui mettent en œuvre cette interface:méthode d'appel immédiatement après la construction de l'objet dans LINQ requête
public interface IRow
{
void Fill(DataRow dr);
}
Habituellement, lorsque je choisis quelque chose de db, je vais:
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;
}
}
maintenant avec .Net 4, je voudrais utiliser AsParallel, et donc LINQ.
Je l'ai fait quelques tests sur, et il accélère les choses beaucoup (IRow.Fill utilise la réflexion, il est donc difficile sur le CPU)
Quoi qu'il en soit mon problème est, comment puis-je faire pour créer un LINQ requête, qui appelle Fills dans le cadre de la requête, de sorte qu'il est correctement parallélisé?
Pour tester les performances, j'ai créé un constructeur qui a pris le DataRow comme argument, mais j'aurais vraiment aimé l'éviter si cela était possible.
Avec le constructeur en place, il est évidemment assez simple:
public IEnumerable<IRow> SelectSomeRowsParallel
{
DataTable table = GetTableFromDatabase();
return from DataRow dr in table.Rows.AsParallel()
select new MySQLRow(dr);
}
Cependant, comme je l'ai dit, j'aimerais vraiment être en mesure de simplement bourrer ma méthode de remplissage dans la requête LINQ, et donc pas besoin la surcharge du constructeur.
Vous étiez en premier, donc vous obtenez le "bon" drapeau :-) Merci pour les nombreuses réponses, toujours agréable d'apprendre quelque chose. – Steffen