procedimiento - linq get return value from stored procedure
LINQ-to-SQL vs procedimientos almacenados? (23)
Un DBA no tiene libertad para realizar cambios en el modelo de datos sin forzarlo a cambiar su código compilado. Con los procedimientos almacenados, puede ocultar este tipo de cambios en cierta medida, ya que la lista de parámetros y los conjuntos de resultados devueltos por un procedimiento representan su contrato, y las entrañas pueden modificarse, siempre que el contrato se cumpla. .
Realmente no veo esto como un beneficio. Ser capaz de cambiar algo aisladamente puede sonar bien en teoría, pero el hecho de que los cambios cumplan un contrato no significa que devuelva los resultados correctos. Para poder determinar cuáles son los resultados correctos, necesita contexto y obtiene ese contexto del código de llamada.
Eché un vistazo a la publicación "Guía para principiantes de LINQ" aquí en StackOverflow ( Guía para principiantes de LINQ ), pero tuve una pregunta de seguimiento:
Estamos a punto de iniciar un nuevo proyecto en el que casi todas las operaciones de nuestra base de datos serán recuperaciones de datos bastante simples (hay otro segmento del proyecto que ya escribe los datos). La mayoría de nuestros otros proyectos hasta este momento hacen uso de procedimientos almacenados para tales cosas. Sin embargo, me gustaría aprovechar LINQ-to-SQL si tiene más sentido.
Entonces, la pregunta es la siguiente: para simples recuperaciones de datos, ¿qué enfoque es mejor, LINQ-a-SQL o procs almacenados? Cualquier pro o estafa específicos?
Gracias.
Algunas ventajas de LINQ sobre sprocs:
- Tipo de seguridad : creo que todos entendemos esto.
- Abstracción : Esto es especialmente cierto con LINQ-to-Entities . Esta abstracción también permite que el marco agregue mejoras adicionales que puede aprovechar fácilmente. PLINQ es un ejemplo de agregar compatibilidad con multi-threading a LINQ. Los cambios de código son mínimos para agregar este soporte. Sería MUCHO más difícil hacer este código de acceso a datos que simplemente llama a sprocs.
- Soporte de depuración : puedo usar cualquier depurador .NET para depurar las consultas. Con sprocs, no se puede depurar fácilmente el SQL y esa experiencia se relaciona en gran medida con el proveedor de la base de datos (MS SQL Server proporciona un analizador de consultas, pero a menudo eso no es suficiente).
- Independiente del proveedor : LINQ funciona con muchas bases de datos y la cantidad de bases de datos compatibles solo aumentará. Los programas no siempre son portátiles entre las bases de datos, ya sea por la sintaxis variable o el soporte de funciones (si la base de datos es compatible con sprocs).
- Despliegue : Otros ya lo han mencionado, pero es más fácil implementar un solo ensamblaje que desplegar un conjunto de sprocs. Esto también se relaciona con el # 4.
- Más fácil : no es necesario que aprenda T-SQL para acceder a los datos, ni tiene que aprender la API de acceso a los datos (por ejemplo, ADO.NET) necesaria para llamar a los sprocs. Esto está relacionado con # 3 y # 4.
Algunas desventajas de LINQ vs sprocs:
- Tráfico de red : sprocs solo necesita serializar los nombres de sproc y los datos de argumento a través del cable mientras LINQ envía toda la consulta. Esto puede ser realmente malo si las consultas son muy complejas. Sin embargo, la abstracción de LINQ permite a Microsoft mejorar esto con el tiempo.
- Menos flexible : Sprocs puede aprovechar al máximo el conjunto de características de una base de datos. LINQ tiende a ser más genérico en su soporte. Esto es común en cualquier tipo de abstracción del lenguaje (por ejemplo, C # vs ensamblador).
- Recompilación : si necesita realizar cambios en la forma de acceso a los datos, debe volver a compilar, actualizar y volver a implementar su ensamblaje. Sprocs a veces puede permitir que un DBA sintonice la rutina de acceso a datos sin necesidad de volver a desplegar nada.
La seguridad y la capacidad de administración son algo sobre lo que la gente también discute.
- Seguridad : por ejemplo, puede proteger sus datos confidenciales restringiendo el acceso a las tablas directamente, y poner ACL en los sprocs. Sin embargo, con LINQ, aún puede restringir el acceso directo a las tablas y, en su lugar, colocar las ACL en vistas de tabla actualizables para lograr un fin similar (suponiendo que su base de datos admita vistas actualizables).
- Capacidad de administración : el uso de vistas también le brinda la ventaja de proteger su aplicación de los cambios en el esquema (como la normalización de tablas). Puede actualizar la vista sin necesidad de cambiar su código de acceso a datos.
Solía ser un gran chico de sproc, pero estoy empezando a inclinarme hacia LINQ como una mejor alternativa en general. Si hay algunas áreas donde los sprocs son claramente mejores, entonces probablemente todavía escribiré un sproc pero accederé usando LINQ. :)
Creo que el argumento pro LINQ parece provenir de personas que no tienen un historial con el desarrollo de bases de datos (en general).
Especialmente si se usa un producto como VS DB Pro o Team Suite, muchos de los argumentos que se presentan aquí no se aplican, por ejemplo:
Más difícil de mantener y probar: VS proporciona una comprobación de sintaxis completa, comprobación de estilo, control referencial y de restricciones y más. También proporciona capacidades de prueba unitarias completas y herramientas de refactorización.
LINQ hace imposible la verdadera prueba unitaria ya que (en mi opinión) falla la prueba ACID.
La depuración es más fácil en LINQ: ¿Por qué? VS permite el paso completo desde el código administrado y la depuración regular de SP.
Compilado en una única DLL en lugar de scripts de implementación: una vez más, VS llega al rescate donde puede construir e implementar bases de datos completas o realizar cambios incrementales seguros de datos.
No tiene que aprender TSQL con LINQ: no, no, pero debe aprender LINQ: ¿cuál es el beneficio?
Realmente no veo esto como un beneficio. Ser capaz de cambiar algo aisladamente puede sonar bien en teoría, pero el hecho de que los cambios cumplan un contrato no significa que devuelva los resultados correctos. Para poder determinar cuáles son los resultados correctos, necesita contexto y obtiene ese contexto del código de llamada.
Um, las aplicaciones débilmente acopladas son el objetivo final de todos los buenos programadores, ya que realmente aumentan la flexibilidad. Ser capaz de cambiar las cosas de forma aislada es fantástico, y son las pruebas de su unidad las que aseguran que todavía se obtienen los resultados adecuados.
Antes de que todos se enojen, creo que LINQ tiene su lugar y tiene un gran futuro. Pero para aplicaciones complejas que requieren gran cantidad de datos, no creo que esté lista para reemplazar los procedimientos almacenados. Esta era una opinión que me había hecho eco un MVP en TechEd este año (seguirán sin nombre).
EDITAR: El lado de las cosas de LINQ to SQL Stored Procedure es algo en lo que todavía necesito leer más, dependiendo de lo que encuentre, puedo alterar mi diatriba anterior;)
Creo que necesitas ir con procs para algo real.
A) Escribir toda tu lógica en linq significa que tu base de datos es menos útil porque solo tu aplicación puede consumirla.
B) No estoy convencido de que el modelado de objetos sea mejor que el modelado relacional de todos modos.
C) Probar y desarrollar un procedimiento almacenado en SQL es muchísimo más rápido que un ciclo de edición de compilación en cualquier entorno de Visual Studio. Solo edita, F5 y presiona seleccionar y estás fuera de las carreras.
D) Es más fácil administrar e implementar procedimientos almacenados que ensamblajes ... simplemente coloca el archivo en el servidor y presione F5 ...
E) Linq to sql aún escribe código malicioso cuando no lo esperas.
Honestamente, creo que lo último sería que MS aumente t-sql para que pueda hacer una proyección de unión implícitamente de la forma en que lo hace linq. t-sql debería saber si desea hacer order.lineitems.part, por ejemplo.
El mejor código es sin código, y con los procedimientos almacenados, debe escribir al menos un código en la base de datos y el código en la aplicación para llamarlo, mientras que con LINQ to SQL o LINQ to Entities, no tiene que escribir ningún adicional código más allá de cualquier otra consulta LINQ además de crear un objeto de contexto.
El procedimiento almacenado facilita las pruebas y puede cambiar la consulta sin tocar el código de la aplicación. También con linq, obtener datos no significa que sean los datos correctos. Y probar la exactitud de los datos significa ejecutar la aplicación, pero con el procedimiento almacenado es fácil de probar sin tocar la aplicación.
El resultado se puede resumir como
LinqToSql para sitios pequeños y prototipos. Realmente ahorra tiempo para la creación de prototipos.
Sps: Universal. Puedo ajustar mis consultas y siempre verifico RealExecutionPlan / EstimatedExecutionPlan.
En general, soy un defensor de poner todo en procedimientos almacenados, por todas las razones por las que los DBA han insistido durante años. En el caso de Linq, es cierto que no habrá diferencia de rendimiento con consultas CRUD simples.
Pero tenga en cuenta algunas cosas al tomar esta decisión: el uso de cualquier ORM se relaciona estrechamente con su modelo de datos. Un DBA no tiene libertad para realizar cambios en el modelo de datos sin forzarlo a cambiar su código compilado. Con los procedimientos almacenados, puede ocultar este tipo de cambios en cierta medida, ya que la lista de parámetros y los conjuntos de resultados devueltos por un procedimiento representan su contrato, y las entrañas pueden modificarse, siempre que el contrato se cumpla. .
Y también, si Linq se utiliza para consultas más complejas, ajustar la base de datos se convierte en una tarea mucho más difícil. Cuando un procedimiento almacenado se está ejecutando lento, el DBA puede centrarse totalmente en el código de forma aislada, y tiene muchas opciones, solo para que el contrato esté satisfecho cuando haya terminado.
He visto muchos casos en los que los problemas graves de una aplicación se solucionaban mediante cambios en el esquema y el código en procedimientos almacenados sin ningún cambio en el código compilado implementado.
Quizás un acercamiento de Hybird sería bueno con Linq? Linq puede, por supuesto, usarse para llamar a procedimientos almacenados.
En mi humilde opinión, RAD = LINQ, RUP = Procs almacenados. Trabajé para una gran compañía de Fortune 500 durante muchos años, en muchos niveles, incluida la administración, y, francamente, nunca contrataría desarrolladores de RUP para desarrollar RAD. Están tan aislados que tienen un conocimiento muy limitado sobre qué hacer en otros niveles del proceso. Con un entorno en silos, tiene sentido darles a los DBA el control sobre los datos a través de puntos de entrada muy específicos, porque otros francamente no conocen las mejores formas de lograr la administración de datos.
Pero las grandes empresas se mueven con lentitud en el campo del desarrollo, y esto es extremadamente costoso. Hay momentos en los que necesita moverse más rápido para ahorrar tiempo y dinero, y LINQ proporciona eso y mucho más.
A veces pienso que los DBA son parciales en contra de LINQ porque sienten que amenaza su seguridad laboral. Pero esa es la naturaleza de la bestia, damas y caballeros.
LINQ definitivamente tiene su lugar en bases de datos específicas de aplicaciones y en pequeñas empresas.
Pero en una gran empresa, donde las bases de datos centrales sirven como centro de datos comunes para muchas aplicaciones, necesitamos abstracción. Necesitamos administrar centralmente la seguridad y mostrar los historiales de acceso. Necesitamos poder hacer un análisis de impacto: si realizo un pequeño cambio en el modelo de datos para atender una nueva necesidad comercial, ¿qué consultas necesitan cambiarse y qué aplicaciones necesitan volverse a probar? Vistas y procedimientos almacenados me dan eso. Si LINQ puede hacer todo eso y hacer que nuestros programadores sean más productivos, lo recibiré con agrado. ¿Alguien tiene experiencia en utilizarlo en este tipo de entorno?
LINQ es nuevo y tiene su lugar. LINQ no se inventó para reemplazar el procedimiento almacenado.
Aquí me centraré en algunos mitos de rendimiento y CONS, solo para "LINQ to SQL", por supuesto que podría estar totalmente equivocado ;-)
(1) La gente dice que la declaración LINQ puede "almacenar en caché" en el servidor SQL, por lo que no pierde rendimiento. Parcialmente cierto. "LINQ to SQL" en realidad es el tiempo de ejecución que traduce la sintaxis de LINQ a la declaración de TSQL. Por lo tanto, desde la perspectiva del rendimiento, una declaración SQL de ADO.NET codificada no tiene ninguna diferencia que LINQ.
(2) Dado un ejemplo, una UI de servicio al cliente tiene una función de "transferencia de cuenta". esta función podría actualizar 10 tablas DB y devolver algunos mensajes en una sola toma. Con LINQ, debe compilar un conjunto de instrucciones y enviarlas como un lote al servidor SQL. el rendimiento de este lote traducido de LINQ-> TSQL difícilmente puede coincidir con el procedimiento almacenado. ¿Razón? Debido a que puede ajustar la unidad más pequeña de la instrucción en el procedimiento almacenado mediante el uso del analizador de SQL incorporado y la herramienta de plan de ejecución, no puede hacer esto en LINQ.
El punto es que cuando se habla de una tabla DB individual y de un pequeño conjunto de datos CRUD, LINQ es tan rápido como SP. Pero para una lógica mucho más complicada, el procedimiento almacenado permite ajustar más el rendimiento.
(3) "LINQ to SQL" fácilmente hace que los novatos introduzcan cerdos de rendimiento. Cualquier persona TSQL senior puede decirle cuándo no usar CURSOR (Básicamente, no debe usar CURSOR en TSQL en la mayoría de los casos). Con LINQ y el encantador bucle "foreach" con consulta, es tan fácil para un novato escribir dicho código:
foreach(Customer c in query)
{
c.Country = "Wonder Land";
}
ctx.SubmitChanges();
Puedes ver que este código decente fácil es muy atractivo. Pero bajo el capó, el tiempo de ejecución de .NET simplemente traduce esto a un lote de actualización. Si solo hay 500 líneas, este es un lote de 500 líneas TSQL; Si hay millones de líneas, esto es un éxito. Por supuesto, el usuario experimentado no usará esta forma para hacer este trabajo, pero el punto es que es muy fácil caer de esta manera.
LINQ hinchará el caché de procedimiento
Si una aplicación utiliza LINQ to SQL y las consultas implican el uso de cadenas que pueden ser muy variables en longitud, la caché de procedimientos de SQL Server se hinchará con una versión de la consulta para cada longitud de cadena posible. Por ejemplo, considere las siguientes consultas muy simples creadas contra la tabla Person.AddressTypes en la base de datos AdventureWorks2008:
var p =
from n in x.AddressTypes
where n.Name == "Billing"
select n;
var p =
from n in x.AddressTypes
where n.Name == "Main Office"
select n;
Si se ejecutan ambas consultas, veremos dos entradas en el caché de procedimientos de SQL Server: una enlazada con un NVARCHAR (7) y la otra con un NVARCHAR (11). Ahora imagina si hubiera cientos o miles de cadenas de entrada diferentes, todas con diferentes longitudes. El caché de procedimiento se llenaría innecesariamente con todo tipo de planes diferentes para la misma consulta exacta.
Más aquí: https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=363290
LINQ no prohíbe el uso de procedimientos almacenados. He usado el modo mixto con LINQ-SQL y LINQ-storedproc . Personalmente, me alegro de no tener que escribir los procesos almacenados ... pwet-tu.
Linq a Sql.
El servidor Sql guardará en caché los planes de consulta, por lo que no hay ganancia de rendimiento para sprocs.
Sus declaraciones linq, por otro lado, serán lógicamente parte y probadas con su aplicación. Los sprocs están siempre separados y son más difíciles de mantener y probar.
Si estuviera trabajando en una nueva aplicación desde cero en este momento, simplemente usaría Linq, no sprocs.
Para la recuperación de datos básicos iría por Linq sin dudarlo.
Desde que me mudé a Linq, he encontrado las siguientes ventajas:
- Depurar mi DAL nunca ha sido tan fácil.
- Compile la seguridad del tiempo cuando el esquema cambia no tiene precio.
- La implementación es más sencilla porque todo está compilado en DLL. No más administración de scripts de implementación.
- Como Linq puede ayudar a consultar todo lo que implemente la interfaz IQueryable, podrá usar la misma sintaxis para consultar XML, Objetos y cualquier otra fuente de datos sin tener que aprender una nueva sintaxis.
Para operaciones simples de CRUD con un solo punto de acceso a datos, yo diría que vaya a LINQ si se siente cómodo con la sintaxis. Para una lógica más complicada, creo que los sprocs son más eficientes en cuanto a rendimiento si eres bueno en T-SQL y sus operaciones más avanzadas. También tiene la ayuda de Tuning Advisor, SQL Server Profiler, depurando sus consultas de SSMS, etc.
Según los gurús, defino LINQ como motocicleta y SP como auto. Si quieres ir a un viaje corto y solo tienes pasajeros pequeños (en este caso 2), ve con gracia con LINQ. Pero si quieres ir a un viaje y tener una banda grande, creo que deberías elegir SP.
Como conclusión, elegir entre motocicleta o automóvil depende de su ruta (empresa), longitud (tiempo) y pasajeros (datos).
Espero que ayude, puedo estar equivocado. :RE
Supongo que te refieres a Linq To Sql
Para cualquier comando CRUD es fácil hacer un perfil del rendimiento de un procedimiento almacenado frente a cualquier tecnología. En este caso, cualquier diferencia entre los dos será insignificante. Pruebe la creación de perfiles para un objeto de campo de 5 (tipos simples) a través de más de 100.000 consultas de selección para descubrir si existe una diferencia real.
Por otro lado, el verdadero factor decisivo será la cuestión de si se siente cómodo poniendo su lógica comercial en su base de datos o no, lo cual es un argumento en contra de los procedimientos almacenados.
También está la cuestión de la posible reversión 2.0. Créeme, me ha pasado un par de veces, así que estoy seguro de que le ha sucedido a otros.
También estoy de acuerdo en que la abstracción es lo mejor. Junto con el hecho de que el propósito original de cualquier ORM es hacer que RDBMS coincida muy bien con los conceptos de OO. Sin embargo, si todo funcionó bien antes de LINQ al tener que desviarse un poco de los conceptos de OO, atorníllelos. Los conceptos y la realidad no siempre encajan bien. No hay lugar para fanáticos militantes en TI.
Tanto LINQ como SQL tienen su lugar. Ambos tienen sus desventajas y ventajas.
A veces, para la recuperación de datos complejos, es posible que necesite procs almacenados. Y a veces es posible que desee que otras personas usen el proceso almacenado en Sql Server Management Studio.
Linq to Entities es excelente para el desarrollo rápido de CRUD.
Claro que puedes construir una aplicación usando solo una o la otra. O puedes mezclarlo. Todo se reduce a tus necesidades. Pero los procesos almacenados SQL no desaparecerán en el corto plazo.
Todas estas respuestas que se inclinan hacia LINQ se refieren principalmente a EASE of DEVELOPMENT que está más o menos relacionada con la mala calidad de la codificación o la pereza en la codificación. Solo soy así.
Algunas ventajas o Linq, las leo aquí, son fáciles de probar, fáciles de depurar, etc., pero en ningún caso están conectadas a la salida final o al usuario final. Esto siempre va a causar problemas al usuario final en el rendimiento. ¿Cuál es el punto de cargar muchas cosas en la memoria y luego aplicar filtros en el uso de LINQ?
Una vez más, TypeSafety, advierte que "tenemos cuidado de evitar el encasillamiento incorrecto", lo que de nuevo es una calidad deficiente que estamos tratando de mejorar utilizando linq. Incluso en ese caso, si hay cambios en la base de datos, por ejemplo, el tamaño de la columna String, entonces linq necesita volverse a compilar y no sería seguro sin eso ... Lo intenté.
Aunque, encontramos que es bueno, dulce, interesante, etc., mientras trabajamos con LINQ, tiene la desventaja de hacer que el desarrollador sea perezoso :) y se comprueba 1000 veces que es malo (puede ser peor) en cuanto al rendimiento en comparación con Stored Procs.
Deja de ser perezoso. Estoy intentando mucho. :)
Prov. Almacenados vs código (Discusión previa)
Create PROCEDURE userInfoProcedure
-- Add the parameters for the stored procedure here
@FirstName varchar,
@LastName varchar
AS
BEGIN
SET NOCOUNT ON;
-- Insert statements for procedure here
SELECT FirstName , LastName,Age from UserInfo where FirstName=@FirstName
and LastName=@FirstName
END
GO
http://www.totaldotnet.com/Article/ShowArticle121_StoreProcBasic.aspx