Ich habe eine Liste von Seriennummern und möchte die Zeilen aus einer Datentabelle entsprechend diesen Zahlen und gegen eine ID extrahieren. Ich verwende die folgenden LINQ-Abfrage für gleiche:So optimieren Sie die Linq-Manipulation, um Zeilen zu erhalten
//list of serial numbers
var serialNumAlreadyExisted = [1,2,3];
var varID = 2;
//get the corresponding rows for these serial numbers
var duplicateRows = (from row in dt.AsEnumerable()
where row.Field<int>("ID") == varID &&
serialNumAlreadyExisted.Any(sr => sr == row.Field<string>("SERIAL_NUMBER"))
select row).ToList();
Der obige Code funktioniert gut für 1-2K Reihen, aber viel Zeit in Anspruch nimmt, wenn es 50K Seriennummern und 50K Datensätze in der Datentabelle sind.
Gibt es eine Möglichkeit, es zu optimieren und die Verarbeitungszeit zu reduzieren?
Wie wäre es 'serialNumAlreadyExisted.Contains (row.Field (" SERIAL_NUMBER "))'? –
Sie könnten die beiden "beitreten", das ist wahrscheinlich das, was ich tun würde, aber ich bezweifle, dass die Leistungsverbesserung bei einem In-Memory-Set auffällig ist. In der Tat, ich bin ziemlich überrascht, dass Sie einen Unterschied mit allem In-Memory überhaupt bemerken. Kann ich mich nicht erinnern, dass 'DataTable' s eifrig geladen sind? Gibt es heutzutage eine faule Version von ihnen? Ich würde definitiv glauben, dass das Laden der Daten noch etwas länger dauert, aber ich gehe davon aus, dass dies ausgeschlossen wurde. –
versuchen Sie, 'DataTable.Select' Methode zu verwenden. z.B. (fest codiertes Beispiel, um die Leistung zu testen): 'DataRow [] dupes = dt.Select (String.Format (" Id = 2 UND SERIAL_NUMBER IN ('1', '2', '3') "));' – ASh