- Registriert
- Juni 2018
- Beiträge
- 651
Konnte das Problem lösen, lag an einer Konvertierung von, die Dapper gemacht hat.
Die genau Problembeschreibung, falls das bei jemand anderem auch auftritt:
Ich habe ein Datum als Filter im Query, also ziehe mir nur Daten, die nach dem 10.04.2021 sind z.B.
In C# habe ich das dann wie folgt programmiert:
Das Problem war, dass hier bei diesem Aufruf dann wohl ständig eine Konvertierung von System.DateTime nach DbType.DateTime nach DbType.Date gemacht wurde. Ich habe dann vor dem Absetzen des Queries das Mapping von Dapper für System.DateTime geändert, damit direkt nach DbType.Date gewandelt wird. Somit wird die Konvertierung nur einmalig und nicht bei jedem Eintrag gemacht.
Sieht dann also so aus:
Am Query habe ich auch nochmal etwas optimiert, dauert jetzt ca. 1 Sekunde für 150 Einträge.
Das ursprüngliche Query, dass ich von den Datenbankleuten bekommen hatte, brauchte ca. 2 Minuten für 150 Einträge...
Wie ich unsere Datenbankspezialisten liebe
Die genau Problembeschreibung, falls das bei jemand anderem auch auftritt:
Ich habe ein Datum als Filter im Query, also ziehe mir nur Daten, die nach dem 10.04.2021 sind z.B.
In C# habe ich das dann wie folgt programmiert:
C#:
public async Task<List<Unit>> GetUnitsByPagination(DateTime startDate, int startingPoint, int rowAmount)
{
var parameters = new DynamicParameters();
parameters.Add("StartDate", startDate, DbType.Date, ParameterDirection.Input);
parameters.Add("StartingPoint", startingPoint, DbType.Int32, ParameterDirection.Input);
parameters.Add("RowAmount", rowAmount, DbType.Int32, ParameterDirection.Input);
string sqlQuery = "SELECT DISTINCT " +
"t.unit_id AS UnitId " +
"FROM MYTABLE t " +
"WHERE " +
"t.created >= :StartDate " +
"AND t.unit_id IS NOT NULL " +
"AND t.unit_id_type = 'Unit' " +
"AND t.equipment LIKE '000%' " +
"ORDER BY t.created " +
"OFFSET :StartingPoint ROWS " +
"FETCH NEXT :RowAmount ROWS ONLY";
var result = await _oracleRepository.LoadDataSqlAsync<Unit, dynamic>(sqlQuery, parameters, "ConString");
return result;
}
Das Problem war, dass hier bei diesem Aufruf dann wohl ständig eine Konvertierung von System.DateTime nach DbType.DateTime nach DbType.Date gemacht wurde. Ich habe dann vor dem Absetzen des Queries das Mapping von Dapper für System.DateTime geändert, damit direkt nach DbType.Date gewandelt wird. Somit wird die Konvertierung nur einmalig und nicht bei jedem Eintrag gemacht.
Sieht dann also so aus:
C#:
public async Task<List<Unit>> GetUnitsByPagination(DateTime startDate, int startingPoint, int rowAmount)
{
var parameters = new DynamicParameters();
parameters.Add("StartDate", startDate, DbType.Date, ParameterDirection.Input);
parameters.Add("StartingPoint", startingPoint, DbType.Int32, ParameterDirection.Input);
parameters.Add("RowAmount", rowAmount, DbType.Int32, ParameterDirection.Input);
string sqlQuery = "SELECT DISTINCT " +
"t.unit_id AS UnitId " +
"FROM MYTABLE t " +
"WHERE " +
"t.created >= :StartDate " +
"AND t.unit_id IS NOT NULL " +
"AND t.unit_id_type = 'Unit' " +
"AND t.equipment LIKE '000%' " +
"ORDER BY t.created " +
"OFFSET :StartingPoint ROWS " +
"FETCH NEXT :RowAmount ROWS ONLY";
// Custom-Mapping for shorter query time
SqlMapper.AddTypeMap(typeof(DateTime), DbType.Date);
var result = await _oracleRepository.LoadDataSqlAsync<Unit, dynamic>(sqlQuery, parameters, "ConString");
return result;
}
Am Query habe ich auch nochmal etwas optimiert, dauert jetzt ca. 1 Sekunde für 150 Einträge.
Das ursprüngliche Query, dass ich von den Datenbankleuten bekommen hatte, brauchte ca. 2 Minuten für 150 Einträge...
Wie ich unsere Datenbankspezialisten liebe