Ho un enorme set di dati che sto cercando di eseguire ma sto riscontrando il seguente errore;
Statement(s) could not be prepared.
Stack Trace
at Microsoft.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at Microsoft.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at Microsoft.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
at Microsoft.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
at Microsoft.Data.SqlClient.SqlDataReader.TryHasMoreRows(Boolean& moreRows)
at Microsoft.Data.SqlClient.SqlDataReader.TryReadInternal(Boolean setTimeout, Boolean& more)
at Microsoft.Data.SqlClient.SqlDataReader.Read()
at Microsoft.EntityFrameworkCore.Storage.RelationalDataReader.Read()
at Microsoft.EntityFrameworkCore.Query.RelationalShapedQueryCompilingExpressionVisitor.QueryingEnumerable`1.Enumerator.MoveNext()
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at SalesForceReportSVC.Controllers.SalesForceDataLoaderController.<GetSDL>d__6.MoveNext() in C:\Users\JNyingi\source\repos\SalesForceReportSVC\SalesForceReportSVC\Controllers\SalesForceDataLoaderController.cs:line 60
L'eccezione viene generata alla seguente dichiarazione
IQueryable<SalesForceProductionReportDto> dLProductions = this.repo_.salesforceLoader.FindAll();
IEnumerable<SalesForceProductionReportDto> reportDtos = dLProductions.ToList();
deposito
public IQueryable<SalesForceProductionReportDto> FindAll()
{
return this.salesForceReport.Set<SalesForceProductionReportDto>().AsNoTracking();
}
Contesto
private void ConfigureAPIIntegrations(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(this.APIdb, opt => opt.CommandTimeout((int)TimeSpan.FromMinutes(20).TotalSeconds));
optionsBuilder.EnableDetailedErrors();
}
Voglio ToList
per implementare e caricare i dati dal database.
MODIFICARE
Anche una semplice query Linq come questa;
List<SalesForceProductionReportDto> salesForces = this.salesForceReport.productionReports.Select(x => x).ToList();
Richiede molto tempo per essere eseguito, ma posso eseguire un'istruzione SELECT
per oltre 15000 record in meno di 1 secondo.
MODIFICA 2
Sto selezionando da una vista come mostrato nel Context
public virtual DbSet<SalesForceProductionReportDto> productionReports { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<SalesForceProductionReportDto>().HasNoKey() .ToView("DailyProductionReport_Vw");
base.OnModelCreating(modelBuilder);
}
Anche se non ho ricevuto un motivo per cui non funziona.
Ho trovato una soluzione al problema sopra riportato, usando FromSqlRaw
Quindi la seguente riga funziona;
List<SalesForceProductionReportDto> salesForces = this.salesForceReport.Set<SalesForceProductionReportDto>().FromSqlRaw<SalesForceProductionReportDto>("SELECT * FROM dbo.ProductionData_Vw;").ToList();