LinqPad-преобразование SQL в команду Linq

недавно я купил LinqPad в надежде, что это позволит мне преобразовать некоторый SQL в оператор LINQ.

используя LinqPad, я могу прикрепить DB и запустить инструкцию SQL, которая возвращает нужные мне результаты.

но я не могу найти "команду" для преобразования этого оператора SQL в LINQ.

можете ли вы сообщить мне, как конвертировать SQL в LINQ с помощью LinqPad? Или другой инструмент.

3 ответов


В общем, нет никаких инструментов для скрытого SQL для Linq как @andres-abel упоминалось раньше, но иногда вам нужно написать Linq, который будет выполняться точно так же, как указанный SQL (например, из-за проблем с производительностью, обратной совместимости или некоторых других причин).

В этом случае я посоветую вам сделать обратное проектирование самостоятельно:

  1. настройка ведения журнала инструкций SQL дампа, генерируемых Linq в stdout используя
  2. вручную перепишите оператор Linq, пока не получите то, что вам нужно

есть инструмент под названием Linqer, но будьте осторожны: транслитерация с SQL на LINQ может дать вам худшее из обоих миров.

например, предположим, вы хотите, чтобы все покупки на 1000 долларов или больше оплачивались наличными или клиентами, которые живут в Вашингтоне. Вот запрос в 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
    )

как перевести это на LINQ? Неправильный путь -транслитерировать запрос в LINQ, пытаясь воспроизвести внешний и внутреннее предложение joins, subquery и group. Правильный способ-отобразить исходный запрос (на английском языке) непосредственно в LINQ, используя линейный поток данных LINQ и свойства ассоциации:

Я хочу, чтобы все покупки...

from p in db.Purchases

...от 1000 долларов или больше...

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

...оплачено наличными...

where p.Customer == null

...или клиентами, которые живут в Вашингтон!--20-->

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

вот последний запрос:

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

Подробнее здесь.


LinqPad не содержит SQL - > LINQ translator. LinqPad фактически не содержит переводчика LINQ->SQL. Для перевода используется библиотека .Net Linq-to-Sql или Entity framework.

Я не знаю ни одного другого инструмента с возможностью. В простых случаях это можно было бы сделать, но для более сложных сценариев это было бы невозможно, поскольку нет выражения LINQ, которое соответствует некоторым конструкциям SQL.