El problema con la diferencia entre llamar a SP directamente y desde el código .NET, tal vez debido a la detección de parámetros. SQL Server puede almacenar en caché un plan de ejecución que no es óptimo para los parámetros que está pasando desde el código.
Para evitar esto, intente agregar WITH RECOMPILE a su definición de SP, por ejemplo,
CREATE PROCEDURE MySP (
... parameters...
) WITH RECOMPILE
AS
BEGIN
...