2012-09-02 15 views
9

Niedawno kupiłem LinqPad w nadziei, że pozwoli mi przekonwertować niektóre SQL do instrukcji LINQ.LinqPad - Konwertuj polecenie SQL na Linq

Korzystając z LinqPad, mogę dołączyć DB i uruchomić instrukcję SQL, która zwraca potrzebne wyniki.

Ale nie mogę znaleźć "polecenia" do przekonwertowania tego polecenia SQL na LINQ.

Czy możesz dać mi znać, jak przekonwertować SQL do LINQ przy użyciu LinqPad? LUB inne narzędzie.

+0

Istnieje narzędzie: zobacz moją odpowiedź poniżej –

+0

Zobacz także to pytanie: http://stackoverflow.com/questions/296972/sql-to-linq-tool –

Odpowiedz

5

Ogólnie rzecz biorąc, nie ma narzędzi, które zakodowałyby SQL na Linq jako wspomnienie @ andres-abel wcześniej, ale czasami trzeba napisać Linq, który wykona dokładnie taki sam kod SQL (na przykład ze względu na problemy z wydajnością, kompatybilność wsteczną lub inne). powody).

W tym przypadku będę porad można zrobić reverse engineering przez siebie: rejestrowanie

  1. configure zrzutu SQL generowane przez Linq do stdout użyciu
  2. ręcznie przepisać oświadczenie Linq aż dostaniesz to, czego potrzebujesz
+1

Linqpad ma naprawdę ładne tłumaczenie zapytania Linq do SQL (chociaż robi to przy użyciu biblioteki .Net Linq-SQL, więc twój przebieg może się różnić). Zauważyłem, że świetnie sprawdza się w nauczaniu tych, którzy dopiero zaczynają na Linq, ale znają SQL, a także sprawdza, czy to, co napisałem w Linq, daje wyniki analogiczne do zapytania SQL. – Elsimer

3

LinqPad nie zawiera tłumacza SQL-> LINQ. LinqPad w rzeczywistości nie zawiera żadnego translatora LINQ-> SQL. Bazuje na bibliotece .Net Linq-to-Sql lub strukturze Entity dla tłumaczenia.

Nie znam też żadnego innego narzędzia z tą funkcją. W prostych przypadkach byłoby to możliwe, ale dla bardziej złożonych scenariuszy byłoby to niemożliwe, ponieważ nie ma żadnego wyrażenia LINQ, które pasuje do niektórych konstrukcji SQL.

38

Istnieje narzędzie o nazwie Linqer, ale należy uważać: transliteracji z SQL do LINQ może dać Ci worst of both worlds.

Załóżmy na przykład, że chcesz, aby wszystkie zakupy o wartości 1000 USD lub większej były opłacane gotówką lub klientami mieszkającymi w Waszyngtonie. Oto zapytanie w języku 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 
    ) 

Jak tłumaczyłby to na LINQ? Błędnym sposobem jest transliteracja transliteracji zapytania do LINQ, próbując odtworzyć zewnętrzne i wewnętrzne sprzężenia, podzapytanie i klauzulę grupy. Właściwy sposób jest mapowanie oryginalnego zapytania (w języku angielskim) bezpośrednio do LINQ, wykorzystując przepływ liniowy LINQ na właściwości danych i Stowarzyszenia:

Chcę wszystkie zakupy ...

from p in db.Purchases 

.. .of 1000 $ lub większy ...

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

... opłacone gotówką ...

where p.Customer == null 

... lub przez klientów, którzy mieszkają w Waszyngtonie

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

Oto ostateczny zapytania:

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

Więcej informacji here.