LinqPad – Converter SQL para o comando Linq

Eu comprei recentemente LinqPad na esperança de que me permita converter alguns SQL em instrução LINQ.

Usando o LinqPad, posso append o database e executar a instrução SQL que retorna os resultados de que preciso.

Mas eu não consigo encontrar um ‘comando’ para converter essa instrução SQL em LINQ.

Você pode por favor me avisar como converter SQL para LINQ usando o LinqPad? OU outra ferramenta.

    Em geral não há ferramentas para converter SQL para Linq como @ andres-abel mencionar antes, mas às vezes você tem que escrever Linq que irá executar exatamente como SQL especificado (por exemplo, devido a problemas de desempenho, compatibilidade com versões anteriores ou algumas outras razões).

    Neste caso , aconselho você a fazer engenharia reversa por conta própria :

    1. configurar o log de instruções SQL de dump geradas pelo Linq para stdout usando
      • ObjectQuery.ToTraceString ,
      • DbCommand.CommandText ,
      • logger disponível para sua fonte de dados
    2. Reescreva manualmente a instrução Linq até obter o que precisa

    Existe uma ferramenta chamada Linqer , mas tenha cuidado: a transliteração do SQL para o LINQ pode lhe dar o pior dos dois mundos .

    Por exemplo, suponha que você queira todas as compras de $ 1000 ou mais pagas em dinheiro ou por clientes que moram em Washington. Aqui está a consulta no 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 ) 

    Como traduzir isso para LINQ? O caminho errado é transliterar a consulta para o LINQ, tentando reproduzir as junções externa e interna, a subconsulta e a cláusula group. O caminho certo é mapear sua consulta original (em inglês) diretamente para o LINQ, aproveitando o stream linear de dados e as propriedades de associação do LINQ:

    Eu quero todas as compras …

     from p in db.Purchases 

    … de $ 1000 ou maior …

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

    … pago em dinheiro …

     where p.Customer == null 

    … ou por clientes que moram em Washington

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

    Aqui está a 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 

    Mais informações aqui .

    O LinqPad não contém nenhum conversor SQL-> LINQ. O LinqPad não contém qualquer conversor LINQ-> SQL. Ele se baseia na biblioteca .Net Linq-to-Sql ou na estrutura Entity para a tradução.

    Eu não sei de nenhuma outra ferramenta com essa capacidade também. Em casos simples, seria possível criar um, mas para cenários mais complexos, seria impossível, pois não há expressão LINQ que corresponda a algumas construções SQL.