ordenar operadores lectura ejemplos datos consultas consulta con comandos clausula buscar linq linq-to-sql

lectura - operadores linq



¿Por qué la gente usa linq para sql? (11)

Dada la premisa:

  • Hay programadores de SQL competentes (las consultas de escritura de correlatos no son un problema)
  • Hay desarrolladores de aplicaciones competentes (correlatos: hay una arquitectura simple / fuerte / flexible para manejar conexiones y consultas simples desde el código)

¿Por qué la gente usa linq para sql?

  • Hay gastos generales agregados a cada transacción
  • Existe una gran probabilidad de pérdida de rendimiento para los cálculos de complejidad moderada (los DB se hacen para procesar conjuntos y cálculos y tienen equipos de ingenieros trabajando en la optimización, ¿por qué meterse con esto?)
  • Hay una pérdida de flexibilidad (si desea agregar otro ui (aplicación que no sea .NET) o un método de acceso, debe volver a colocar las consultas en la base de datos o crear una capa de acceso a datos por separado)
  • Existe una pérdida de seguridad al no tener un control centralizado de escritura / actualización / lectura en la base de datos (por ejemplo, un registro ha cambiado: si permite que las aplicaciones usen linq to sql para actualizar, entonces no puede probar qué aplicación lo cambió o qué) instancia de una aplicación lo cambió)

Sigo viendo preguntas sobre linq to sql y me pregunto si me estoy perdiendo algo.


Sigo viendo preguntas sobre linq to sql y me pregunto si me estoy perdiendo algo.

No es que te estés perdiendo algo. Es que tienes algo que la mayoría de las tiendas no tienen:

Hay programadores de sql competentes

Además, en su tienda, los programadores de sql competentes prefieren escribir sql.

Aquí hay una respuesta punto por punto:

Hay gastos generales agregados a cada transacción

Generalmente verdad. Esto se puede evitar traduciendo las consultas antes de que sean necesarias para ejecutarse utilizando CompiledQuery para muchos (¡pero no todos!) Escenarios.

Existe una gran probabilidad de pérdida de rendimiento para los cálculos de complejidad moderada (los DB se hacen para procesar conjuntos y cálculos y tienen equipos de ingenieros trabajando en la optimización, ¿por qué meterse con esto?)

O está escribiendo linq, que se traduce a sql, y luego se genera un plan desde el optimizador - o su sql de escritura desde el cual el optimizador genera un plan. En ambos casos, le está diciendo a la máquina lo que quiere y se supone que debe averiguar cómo hacerlo. ¿Está sugiriendo que subvertir el optimizador mediante el uso de sugerencias de consulta es una buena práctica? Muchos programadores de SQL competentes no estarán de acuerdo con esa sugerencia.

Hay una pérdida de flexibilidad (si desea agregar otro ui (aplicación que no sea .NET) o un método de acceso, debe volver a colocar las consultas en la base de datos o crear una capa de acceso a datos por separado)

Mucha gente que usa linq ya es SOA. El linq vive en un servicio. La aplicación no .NET llama al servicio. Bada-bing bada-boom.

Existe una pérdida de seguridad al no tener un control centralizado de escritura / actualización / lectura en la base de datos (por ejemplo, un registro ha cambiado: si permite que las aplicaciones usen linq to sql para actualizar, entonces no puede probar qué aplicación lo cambió o qué) instancia de una aplicación lo cambió)

Esto simplemente no es cierto. Usted prueba qué aplicación está conectada y emitiendo comandos de SQL de la misma manera que prueba qué aplicación está conectada y llamando a un sproc.


Algunas características útiles son el depurador que recoge los errores de sytax en su consulta, en comparación con la escritura de sentencias de SQL como cadenas. Errores que no serán recogidos hasta el tiempo de ejecución.

Además, encuentro que las sentencias LINQ son más fáciles de leer que SQL.


Déjame hacerte una lista de algunos puntos:

  1. Hay pequeñas empresas de software o medianas empresas que desarrollan su software en la empresa y que prefieren centrarse en conseguir muchos desarrolladores de aplicaciones que en conseguir un desarrollador freelance de DB o incluso contratar uno de forma permanente.
  2. En la mayoría de los casos, la sobrecarga no es un problema, ya sea debido a la cantidad de datos a procesar o debido al bajo tráfico. Además, cuando se usa correctamente, LINQ to SQL puede realizar tan rápido como la mayoría de las consultas SQL + el código .net asociado.
  3. Muchas empresas simplemente se apegan a la pila de Microsoft y solo pueden disfrutar de la integración. Alguna otra compañía desarrolla utilizando SOA simplemente no hay problema. Los otros no están obligados a elegir LINQ-to-SQL y si hacen esa elección es su problema cómo integrarlos. Nadie dijo que LINQ-to-SQL es una bala de plata :)
  4. Creo que la seguridad se gana con LINQ-a-SQL porque me he topado con muchas consultas SQL tomando datos no escapados con concatenación de cadenas, etc. y explicar la idea de la consulta parametrizada nunca ha sido tan fácil. Además, como todas las consultas se convierten finalmente en SQL, a menos que el problema de seguimiento que usted describe ocurra a través de un procedimiento almacenado, nuevamente no hay ningún problema.

También creo que su pregunta puede plantearse de manera más general para abordar todos los ORM y no solo LINQ-a-SQL, y aún así la mayor parte de lo que dije sería cierto.


El problema es que es muy raro que en algún lugar haya un desarrollador de SQL competente al que le guste escribir SQL y que no quiera hacer otra cosa. Me consideraría competente en SQL, solía hacer todas mis capas de acceso a datos con procedimientos almacenados o consultas parametrizadas. El problema es que lleva años y es aburrido. Prefiero estar escribiendo aplicaciones geniales que perder el tiempo con capas de acceso a datos que esencialmente tienen una instrucción SQL (o proceso) de selección, inserción, actualización y eliminación repetidas docenas de veces para cada objeto de datos.

Linq-to-SQL quita algo de la naturaleza repetitiva. Tiene una herramienta para generar automáticamente los objetos comerciales a partir del esquema de su base de datos, y le brinda un lenguaje de consulta integrado y agradable que se verifica con el tipo de tiempo de compilación y está en su código (los procesos almacenados son un problema para el control de la fuente de forma ordenada)

Puedo escribir un DAL en Linq-to-sql varias veces más rápido que utilizando SQL simple, procedimientos almacenados o consultas parametrizadas.

Si desea mantener el uso de procs almacenados, tanto linq-sql como EF, ambos admiten el uso de procs almacenados para todos sus accesos de datos, solo tiene que configurar las asignaciones apropiadas. Por lo tanto, aún puede usar sus procedimientos almacenados para registrar detalles e implementar la seguridad si lo desea. Tendemos a optar por usar Windows Auth, y lo utilizamos para restringir el acceso a cada tabla para los distintos usuarios, luego tenemos un montón de activadores en las tablas que rastrean los detalles para fines de auditoría.

Dos cosas que rápidamente señalaré es que, en primer lugar, el marco de la entidad parece estar recibiendo más apoyo de MS en este momento, y sospecho que se considerará el tipo de estándar predeterminado para el futuro en lugar de linq-a-sql. En segundo lugar, en .Net 3.5, EF y linq-to-sql no tienen un soporte muy bueno para las aplicaciones desconectadas de n niveles. En ambos de ellos, tienes que andar por la borda ya sea serializando contextos de datos a través de tus niveles desconectados, o separar y volver a adjuntar tus objetos de datos manualmente. Esto ha mejorado mucho en el .net 4.0 sin embargo. Solo algo a tener en cuenta según la versión que tenga disponible.


No estoy diciendo que esta sea una solución ideal o incluso un gran ejemplo (fue el resultado de una restricción de alto nivel en la arquitectura, no es algo que necesariamente hubiéramos elegido desde cero), pero ...

Trabajé en una aplicación donde el código estaba completamente aislado de la base de datos, excepto a través de un conjunto de procesos almacenados expuestos. El código no pudo "saber" nada sobre el esquema de la base de datos, excepto que se devolvió de los procesos almacenados.

Si bien esto no es tan inusual y no es demasiado difícil escribir un DAL con ADO o lo que sea, decidí probar Linq a Sql, aunque no lo usaría para su propósito real y no lo haría. Usa la mayoría de las características. Resulta que fue una gran decisión.

Creé la clase Linq to Sql, arrastré los procesos almacenados desde el explorador del servidor al lado derecho del diseñador, luego ... Espere, no hay entonces. Estaba bastante hecho.

Linq creó métodos fuertemente tipados para cada proceso almacenado. Para los procesos que devolvieron filas de datos, Linq creó automáticamente una clase para los elementos en cada fila y devolvió una List<generatedClass> para ellos. Envolví las llamadas en una clase DAL pública liviana que hizo algunas verificaciones y algunos ajustes automáticos de parámetros y terminé. Escribí una clase de objeto de negocio y asigné los objetos de clase Linq generados dinámicamente al objeto de negocio (hice esto a mano, pero no es difícil de hacer o mantener).

El programa ahora es inmune a cualquier cambio de esquema que no afecte a las firmas de procedimientos almacenados. Si las firmas cambian, simplemente arrastramos el proceso anterior del diseño y lo arrastramos de nuevo para regenerar el código. Unos pocos pasan por las pruebas unitarias para realizar cambios (que generalmente no son más altos que la interfaz DAL pública) y se realiza. Los elementos anteriores al DAL utilizan las técnicas de Linq to Objects para seleccionar, filtrar y ordenar los datos que no están en el formato correcto directamente de las llamadas de proceso almacenadas.

Tenemos algunos DBA excelentes que escriben los procedimientos almacenados y un grupo completamente diferente que escribe el otro código, así que quizás sea un buen ejemplo de por qué (y cómo) puede usar LINQ en el escenario que describe.


Para consultas muy simples, la sobrecarga de una capa adicional se suma al costo de ida y vuelta. Para consultas algo más complejas en los escenarios normales de ''aplicaciones de negocios'', las optimizaciones realizadas por la magia de traducción de expresión de SQL a SQL- a menudo pueden ahorrar mucho.

Como ejemplo, recientemente hice una traducción 1: 1 de una línea 1400+ (!) Almacenada por el cliente proc a L2S. No solo pasó de 1400 líneas de SQL a 500 líneas de código mucho más legible, tipificado y comentado. También comenzó a golpear la base de datos con un promedio de ~ 1500 lecturas en lugar de ~ 30k lecturas. Esto es incluso antes de que empecé a ver las optimizaciones del lado de la base de datos: ese ahorro es algo que puedo atribuir al 100% a la capacidad de L2S para eliminar los predicados que se pueden evaluar del lado del cliente.


Para mí, se necesita mucho menos tiempo para escribir linq en el código sql que para escribir un montón de procedimientos almacenados. Esto es especialmente cierto cuando el diseño no está terminado, en ese caso todavía no sé cuánto trabajo quiero hacer en los objetos de C # y cuánto quiero hacer en SQL.

Por lo tanto, puedo omitir la creación de conjuntos de datos, no tengo que hacer clic en hacer clic para agregar consultas, básicamente, linq to sql significa que puedo cambiar mi código en menos tiempo.

Además, como gran fanático de Haskell, puedo escribir muchos códigos de estilo funcional con linq to sql y simplemente funciona.


Preguntas / respuestas existentes en el mismo sentido / espíritu:

Personalmente creo que no hay una respuesta correcta o incorrecta. Depende de lo que estés desarrollando y de cómo lo estés desarrollando. Si necesita un rendimiento de gran nitidez, tenga un modelo de datos demasiado complejo, etc ... omita la abstracción. Si sientes que la abstracción acelera tu tiempo de desarrollo, como la idea de capturar toda la lógica de la aplicación en un solo código base, etc ... úsala.


Puede ser un caso de conveniencia que triunfe sobre el rendimiento. Si está programando a niveles de rendimiento superior de Facebook, podría pensar en cada ciclo de reloj, pero la verdad es que la mayoría de las aplicaciones no necesitan esta atención y se benefician de la eficiencia en el mantenimiento del código y el tiempo de desarrollo (100k contratista vs otro $ erver).

Dicho esto, hay un caso para la externalización de la mayor parte del procesamiento de consultas desde el cuadro de DB en sistemas a muy alta escala; de lo contrario, el DB es el cuello de la botella y es necesario fragmentar o rediseñar la arquitectura. Costoso.

Creo que es justo decir que LINQ se escalará mejor / más fácilmente, tanto en términos de servidores como de muchos núcleos, ya que su base de código LINQ obtendrá m-core para ''gratis'' tan pronto como MS release C # 4.0.

Veo su punto de vista y como un desarrollador que no es ASP.NET recién comienza un proyecto www por primera vez, no puedo ver el punto del 80% de ASP.NET (temas, controles, etc.). ¡Necesito aprender más y codificar más que el propio HTML! - De nuevo, estoy seguro de que hay una buena razón para todo esto.

--- No tengo los 50 puntos para comentar sobre la publicación que quiero, así que lo estoy haciendo aquí ---

David B sugiere que escribir algo de SQL es todo lo que hay para sacar el máximo provecho de SQL Server y que el uso de sugerencias de consulta es el mecanismo de dirección. La misma tarea se puede lograr de muchas maneras diferentes en SQL y muchas con miles de veces la ganancia de rendimiento. Sugiero leer la consulta interna de T-SQL (Itzik Ben Gan). Una y otra vez, Itzik muestra cómo repensar la consulta y usar nuevos comandos para reducir las lecturas lógicas a veces de miles a menos de diez.


Respuesta simple, hay dos enfoques: crear artilugios exquisitos de Rube Goldberg o simplemente hacer el trabajo de una manera sencilla. Muchos desarrolladores se inclinan hacia el primero.

Los desarrolladores se aburren fácilmente y, a menudo, personalmente disfrutan haciendo las cosas de una manera más difícil que parece proporcionar cierta belleza intelectual. ¿Está desarrollando una aplicación o escribiendo un doctorado? Como mi director de MSFT solía gritar en los pasillos, "¡No quiero otro proyecto de investigación!"


por favor repita después de mi (min 3x)

  • No hay bala de plata

  • No usaré una tecnología solo porque es lo último de msft

  • No usaré algo solo para incluirlo en mi currículum.

No solo son sus codificadores SQL competentes, sino que cualquier programador de aplicaciones decente, especialmente las aplicaciones LOB, deben escribir SQL intermedio. Si no sabe nada de SQL y está escribiendo LINQ to SQL, ¿cómo va a depurar sus llamadas de datos? ¿Cómo los perfilarás para solucionar cuellos de botella?

Estamos probando LINQ to SQL y creo que hay problemas importantes, como:

  • No hay una forma sencilla de devolver los resultados de la consulta a otro objeto. Esto en sí mismo parece una locura. Microsoft creó el tipo de datos anónimo var, y recomienda usarlo, pero no hay forma de mover estos datos fuera de su método local, por lo tanto, el paradigma oo se rompe si tiene que usar los datos en la misma función que los recuperó.

  • Las tablas NO son objetos. Estudie en la tercera forma normal, etc. Las bases de datos relacionales son para almacenar datos, no para usarlos. No quiero ser restringido o alentado a usar mis tablas como objetos. Los datos que recupero de la base de datos muy a menudo serán uniones de varias tablas y pueden incluir conversiones de SQL, funciones, operadores, etc.

  • No hay ganancia de rendimiento, y una ligera pérdida

  • Ahora tengo mucho más código para preocuparme. Existen los archivos dbml y aún un DAL para escribir el LINQ. Sí, mucho de esto es generado por una máquina, eso no significa que no esté allí, es otra cosa que puede salir mal (es decir, sus archivos dbml, etc.).

Ahora que he dado el fondo, intentaré responderte la pregunta real, ¿por qué la gente usa LINQ To SQL:

  • Es lo último de Microsoft y lo quiero en mi currículum.
  • Msft ha convencido a los gerentes / ejecutivos de que reducirá el tiempo de codificación
  • Los desarrolladores odian el SQL. (No hay un buen entorno de desarrollo o depuración, excepto de forma manual; sería bueno tener una mejor inteligencia para una herramienta de SQL).

Aliento a las personas a no subirse al carro simplemente porque todos los demás lo son, aprenden lo suficiente como para ponerlo en su currículum, estén dispuestos a usarlo si se lo obliga a hacerlo, pero primero intente entender los pros y los contras.