2012-09-02 8 views
9

Compré recientemente LinqPad con la esperanza de que me permita convertir algunos SQL en una declaración LINQ.LinqPad - Convierte comandos de SQL a Linq

Utilizando LinqPad, puedo adjuntar DB y ejecutar la declaración SQL que devuelve los resultados que necesito.

Pero no puedo encontrar un 'comando' para convertir esa declaración SQL en LINQ.

¿Puede indicarme cómo convertir SQL a LINQ utilizando LinqPad? O otra herramienta.

+0

Hay una herramienta: vea mi respuesta a continuación –

+0

También vea esta pregunta: http://stackoverflow.com/questions/296972/sql-to-linq-tool –

Respuesta

5

En general no hay herramientas para ocultar SQL a Linq como @andres-abel mencionar antes, pero a veces hay que escribir Linq que se ejecutará exactamente como el SQL especificado (por ejemplo, debido a problemas de rendimiento, compatibilidad con versiones anteriores o algún otro razones).

En este caso Yo te aconsejo que hacer ingeniería inversa por sí mismo: tala

  1. de configuración de sentencias SQL volcado generados por LINQ a stdout usando
  2. reescribir manualmente declaración de LINQ hasta que obtendrá lo que necesita
+1

Linqpad tiene una muy buena traducción de la consulta Linq a SQL (aunque lo hace utilizando la biblioteca .Net Linq-to-SQL, por lo que su kilometraje puede variar). Descubrí que hace un gran trabajo al educar a aquellos que recién comienzan en Linq pero que están familiarizados con SQL, así como a verificar que lo que escribí en Linq está produciendo resultados análogos a una consulta SQL. – Elsimer

3

LinqPad no contiene ningún traductor SQL-> LINQ. LinqPad tampoco contiene ningún traductor LINQ-> SQL. Se basa en la biblioteca .Net Linq-to-Sql o en el marco Entity para la traducción.

No conozco ninguna otra herramienta con esa capacidad tampoco. En casos simples sería posible hacer uno, pero para escenarios más complejos sería imposible ya que no hay una expresión LINQ que concuerde con algunas construcciones SQL.

38

Hay una herramienta llamada Linqer, pero tenga cuidado: la transliteración de SQL para LINQ le puede dar la worst of both worlds.

Por ejemplo, supongamos que desea todas las compras de $ 1000 o más pagadas en efectivo o por clientes que viven en Washington. Aquí está la consulta en SQL:

SELECT p.* 
FROM Purchase p 
    LEFT OUTER JOIN 
     Customer c INNER JOIN Address a ON c.AddressID = a.ID 
    ON p.CustomerID = c.ID 
WHERE 
    (a.State = 'WA' || p.CustomerID IS NULL) 
    AND p.ID in 
    (
     SELECT PurchaseID FROM PurchaseItem 
     GROUP BY PurchaseID HAVING SUM (SaleAmount) > 1000 
    ) 

¿Cómo se traduciría esto a LINQ? La forma incorrecta es transcribir la consulta en LINQ, tratando de reproducir las uniones externas e internas, subconsulta y cláusula de grupo. La forma correcta es mapear su búsqueda original (en Inglés) directamente en LINQ, el aprovechamiento de flujo lineal de LINQ de propiedades de datos y asociación:

Quiero todas las compras ...

from p in db.Purchases 

.. .de $ 1000 o mayor ...

where p.PurchaseItems.Sum (pi => pi.SaleAmount) > 1000 

... pagado en efectivo ...

where p.Customer == null 

... o por clientes que viven en Washington

|| p.Customer.Address.State == "WA" 

Aquí está la pregunta final:

from p in db.Purchases 
where p.PurchaseItems.Sum (pi => pi.SaleAmount) > 1000 
where p.Customer == null || p.Customer.Address.State == "WA" 
select p 

Más información here.