Il problema con la differenza tra chiamare SP direttamente e dal codice .NET, forse a causa dello sniffing dei parametri. SQL Server potrebbe memorizzare nella cache un piano di esecuzione che non è ottimale per i parametri che stai passando dal codice.
Per evitare ciò, prova ad aggiungere WITH RECOMPILE alla tua definizione SP, ad es.
CREATE PROCEDURE MySP (
... parameters...
) WITH RECOMPILE
AS
BEGIN
...