web-dev-qa-db-fra.com

LinqPad - Convertir SQL en commande Linq

J'ai récemment acheté LINQPad dans l'espoir que cela me permettrait de convertir des instructions SQL en instructions LINQ.

À l'aide de LINQPad, je peux attacher une base de données et exécuter l'instruction SQL qui renvoie les résultats dont j'ai besoin.

Mais je ne trouve pas de "commande" pour convertir cette instruction SQL en LINQ.

Pouvez-vous me faire savoir comment convertir SQL en LINQ en utilisant LINQPad OR un autre outil?

14
Ravi Ram

En général, il n'y a pas d'outils pour convertir SQL en Linq comme mentionné @ etres-abel auparavant, mais parfois vous devez écrire Linq qui s'exécutera exactement comme SQL spécifié (par exemple en raison de problèmes de performances, de compatibilité descendante ou pour d'autres raisons).

Dans ce cas je vous conseille de faire de l'ingénierie inverse par vous-même :

  1. configurer la journalisation des instructions SQL de vidage générées par Linq sur stdout à l'aide de
  2. réécrire manuellement l'instruction Linq jusqu'à ce que vous obteniez ce dont vous avez besoin
8
Akim

Il existe un outil appelé Linqer , mais attention: la translittération de SQL vers LINQ peut vous donner le pire des deux mondes .

Par exemple, supposons que vous souhaitiez que tous les achats de 1 000 $ ou plus soient payés en espèces ou par des clients résidant à Washington. Voici la requête 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
    )

Comment traduire cela en LINQ? La mauvaise façon est de transliterate la requête dans LINQ, en essayant de reproduire les jointures externes et internes, la sous-requête et la clause group. La bonne façon consiste à mapper votre requête d'origine (en anglais) directement dans LINQ, en tirant parti du flux linéaire de données et des propriétés d'association de LINQ:

Je veux tous les achats ...

from p in db.Purchases

... de 1000 $ ou plus ...

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

... payé en espèces ...

where p.Customer == null

... ou par des clients résidant à Washington

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

Voici la dernière requête:

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

Plus d'informations ici .

45
Joe Albahari

LinqPad ne contient aucun traducteur SQL-> LINQ. LinqPad ne contient pas non plus de traducteur LINQ-> SQL. Il s'appuie sur la bibliothèque .Net Linq-to-Sql ou le framework Entity pour la traduction.

Je ne connais aucun autre outil avec cette capacité non plus. Dans des cas simples, il serait possible d'en créer un, mais pour des scénarios plus complexes, il serait impossible car il n'y a pas d'expression LINQ correspondant à certaines constructions SQL.

5
Anders Abel