What you could do is to remove the ToList()
from your query. This would change your code from making a single query that returns many values to two queries, each returning a single value.
Verwenden Sie Linq, um den ersten und den letzten Wert auszuwählen
Ich möchte nur die ersten und letzten Werte in einem Datumsbereich erhalten. Ich habe folgenden Code:
using (var myEntities = new dataEntities())
{
var myValues = (from values in myEntities.PointValues
where values.PointID == dataValue && values.DataTime >= fromDate && values.DataTime <= toDate
orderby values.DataTime
select new BarChartValue
{
Time = values.DataTime,
Value = values.DataValue
}).ToList();
var myBarChart = new List<BarChartValue> { myValues.First(), myValues.Last() };
return myBarChart;
}
Dies erscheint mir ineffizient, da ich zunächst die gesamten Werte für den Datumsbereich auswähle. Ich kann anscheinend keinen Weg finden, den select-Befehl als erstes und letztes zu bezeichnen. Sicher muss es einen Weg geben, dies zu tun?
Als Antwort auf Svick.
Also, wenn ich das mache:
var firstValue = (from values in myEntities.PointValues
where values.PointID == dataValue && values.DataTime >= fromDate && values.DataTime <= toDate
orderby values.DataTime
select new BarChartValue
{
Time = values.DataTime,
Value = values.DataValue
}).First();
var lastValue = (from values in myEntities.PointValues
where values.PointID == dataValue && values.DataTime >= fromDate && values.DataTime <= toDate
orderby values.DataTime
select new BarChartValue
{
Time = values.DataTime,
Value = values.DataValue
}).Last();
Ist das der beste Weg, dies zu tun? Ich habe keine Werkzeuge für die Profilerstellung (oder ich bin mir nicht sicher, wie ich sie verwenden soll).
Die von svick bereitgestellte Lösung lautet:
var myValues = (from values in myEntities.PointValues
where values.PointID == dataValue && values.DataTime >= fromDate && values.DataTime <= toDate
orderby values.DataTime
select new BarChartValue
{
Time = values.DataTime,
Value = values.DataValue
});
var myBarChart = new List<BarChartValue> { myValues.First(), myValues.OrderByDescending(p => p.Time).First() };
Ein großer Teil davon ist auf mein mangelndes Verständnis des Unterschieds zwischen IQueryable, IEnumerable und List zurückzuführen. Hier ist eine gute Erklärung, die mir geholfen hat, ein bisschen mehr zu verstehen, was los ist:
https://stackoverflow.com/questions/4844660/differences-between-iqueryable-list-ienumerator
2 Antworten auf die Frage
Create the base query:
var myValues = (from values in myEntities.PointValues
where values.PointID == dataValue && values.DataTime >= fromDate && values.DataTime <= toDate
select new BarChartValue
{
Time = values.DataTime,
Value = values.DataValue
})
Then build up the first and last query:
var firstAndLast = myValues.OrderBy(x => values.DataTime).Take(1)
.Union(
myValues.OrderByDescending(x => values.DataTime).Take(1)
).ToList();
This will result in one SQL query if the backend is an SQL database and will not recieve entites which are unnecessary (i think the Last() would download all entities).
Verwandte Probleme
-
11
Zu viele Schleifen in Drawing App
-
5
Generieren von CSV-Zeichenfolgen für verschiedene Dienstprogramme von Drittanbietern
-
2
Implementierung eines PID-Controllers
-
9
Ein Singleton-Muster in C # implementieren
-
5
Bester Weg, um Parameter an die Factory-Klasse zu übergeben?
-
4
Zählen der Anzahl der Punkte, die sowohl einen größeren Theta-Wert als auch einen größeren Radius ha...
-
7
Eine Datei für ein Spiel analysieren
-
1
Parsing einer Spieldatei
-
5
Einfaches Design der ASP.NET C # -Klasse
-
5
Raster aus der Quellhierarchie aktualisieren