Ho un problema con stored procedure e Entity Framework.Entity Framework Problema durante l'esecuzione di stored procedure
Lasciatemi spiegare cosa sta succedendo ... e cosa ho provato fino ad ora.
Ho una stored procedure, che non fa un sacco
SELECT
COUNT(DISTINCT(EmailAddress)) AcceptedQuotes,
CONVERT (DATE,QuoteDate) QuoteDate
FROM
Quote Q
JOIN
Person P on Q.PersonPk = P.Pk
JOIN
Product Pr on Q.ProductPk = Pr.Pk
JOIN
Accepted A on Q.Pk = A.QuotePk
WHERE
QuoteDate between @startDate and @endDate
AND CompanyPk = @companyPk
AND FirstName != 'Test'
AND FirstName != 'test'
AND FirstName != 'EOH'
voglio eseguire questo, e funziona bene in SSMS e non tiene nemmeno 1 secondo.
Ora, importare questo in Entity Framework, il tempo è scaduto e ho impostato il timeout di comando per 120 ...
Ok, quindi quello che ho provato finora e quello che ho provato.
Se utilizzo il modo SqlCommand
, SqlDataAdapter
, DataTable
, con la mia stringa di connessione, viene eseguito come previsto. Quando utilizzo la stringa di connessione di Entity Framework in questo scenario, si verifica un timeout.
Ho modificato la mia procedura memorizzata per includere l'opzione "Ricompila" e ho anche provato il modo SET ARITHABORT
, senza fortuna, si verifica un timeout durante l'esecuzione dell'EF.
Si tratta di un bug in EF?
Ora ho quasi deciso di riscriverlo utilizzando l'accesso ai dati "vecchia scuola".
Si noti inoltre che l'EF viene eseguito correttamente con altri proc memorizzati, dallo stesso database.
Tutte le idee o aiuto sarebbe molto apprezzato ...
PS. Ho trovato questo articolo, ma nessun aiuto né :(
http://www.sommarskog.se/query-plan-mysteries.html
Puoi provare una query molto più semplice senza alcun dove, come selezionare TOP 1, e vedere se ottieni i risultati –
Potresti pubblicare il codice che utilizzi per eseguire questa query? Inoltre, prova ad usare il profiler del server SQL per vedere cosa sta succedendo sotto il cofano. Forse stai passando il valore sbagliato per i parametri nel caso EF? –
Bene, ho eseguito il profiler e EF sta uccidendo il server DB. ** CPU 3**, ** legge 1364453 ** che diavolo, e questo è stato modificato per non usare una clausola where con parametri, e selezionare solo top 10 – Kobie