DataTable Sélectionnez mise en Œuvre à de Multiples ET Conditions
J'ai un DataTable avec environ 50 000 lignes que je suis en utilisant DataTable.Select
pour extraire des lignes d'. Le Select
nécessite plusieurs AND
conditions, y compris une wildcard match. J'ai joué autour et a constaté que, en procédant de la même Select
en plusieurs étapes, le temps d'exécution peut être considérablement réduite, mais en changeant l'ordre de la AND
déclarations ne pas l'affecter.
//This takes ~ 750 ms
DataRow[] results = myDataTable.Select("Field1 LIKE '*" + term1 + "*'" +
"AND Field2 = '" + term2 + "'" +
"AND Field3 = '" + term3 + "'");
//This also takes ~750 ms
DataRow[] results2 = myDataTable.Select("Field3 = '" + term3 + "'" +
"AND Field2 = '" + term2 + "'" +
"AND Field1 LIKE '*" + term1 + "*'");
//This takes 0.415 ms
DataTable table1 = myDataTable.Select("Field3 = '" + term3+ "'").CopyToDataTable();
DataTable table2 = table1.Select("Field2 = '" + term2 + "'").CopyToDataTable();
DataRow [] results3 = table2.Select("Field1 LIKE '*" + term1 + "*'");
Ma question est, est-il un moyen de toujours faire le SELECT
opération évaluer AND
conditions de gauche à droite afin que le nombre d'enregistrements recherchés seraient réduits entre les étapes? Il semblerait qu'il pourrait être un bon moyen de gagner du temps. Merci pour vos idées.
OriginalL'auteur DaveH | 2013-04-25
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser
Linq
(à noter que le plus lent condition est la dernière):Utilisation
CopyToDataTable
si vous souhaitez créer une nouvelle Table de données à partir du résultat,ToArray
pour créer unDataRow[]
ou à laisser et à l'utilisationforeach
pour énumérer le résultat sans la création d'une nouvelle collection.OriginalL'auteur Rango
Nan.. une table de données n'a sélectionnez ligne par ligne.
Vous pouvez écrire votre code un peu plus court:
Ou... si vous faites une extension supplémentaire de la méthode, comme ceci:
statique publique DataRow [], Sélectionnez(c'IEnumerable lignes, chaîne de filtre)
{
retourner les lignes.CopyToDataTable().Sélectionnez(filtre);
}
L'aide de cette extension rend votre code plus court:
Ou:
Ouvrant la voie à:
DataTables
et troisDataRow[]
en mémoire juste pour filtrer une table, très inefficace.Correct... je suis resté près de sa solution possible pour assurer la compatibilité. Je admid votre solution est beaucoup mieux et beaucoup plus vite, mais je peux imaginer que plus d'un des critères complexes (avec ? en comme, etc.) serait jeter de nouveaux problèmes tels que d'avoir à utiliser des regex, etc.
OriginalL'auteur Martin Mulder