Saltar al contenido

LinqPad: comando Convertir SQL a Linq

Solución:

Existe una herramienta llamada Linqer, pero tenga cuidado: la transliteración de SQL a LINQ puede brindarle lo peor de ambos mundos.

Por ejemplo, suponga que desea que todas las compras de $ 1000 o más se paguen 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 traduciría esto a LINQ? El camino equivocado es transcribir la consulta en LINQ, tratando de reproducir las uniones externas e internas, la subconsulta y la cláusula de grupo. La forma correcta es mapear su consulta original (en inglés) directamente en LINQ, aprovechando el flujo lineal de datos y las propiedades de asociación de LINQ:

Quiero todas las compras …

from p in db.Purchases

… de $ 1000 o más …

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 consulta 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 info aquí.

En general, no hay herramientas para convertir SQL a Linq como @ andres-abel mencionó antes, pero a veces tienes que escribir Linq que se ejecutará exactamente como SQL especificado (por ejemplo, debido a problemas de rendimiento, compatibilidad con versiones anteriores o algunas otras razones).

En este caso Te aconsejaré que hagas ingeniería inversa tú mismo.:

  1. configurar el registro de declaraciones SQL de volcado generadas por Linq para stdout utilizando
    • ObjectQuery.ToTraceString,
    • DbCommand.CommandText,
    • registrador disponible para su fuente de datos
  2. reescriba manualmente la declaración de Linq hasta que obtenga lo que necesita

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

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

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *