Конвертировать SQL-запрос обратно в выражение Linq программно - PullRequest
2 голосов
/ 21 мая 2009

Можно ли каким-то образом программно преобразовать SQL-запрос в дерево выражений linq? Предполагается, что запрос sql генерируется этим запросом linq, поэтому я считаю его сериализацией \ десериализацией запросов linq в формат t-sql бедняков.

Спасибо.

Ответы [ 3 ]

2 голосов
/ 21 мая 2009

Все возможно, просто требуется груз работы. Проблема заключается в том, что вам сначала нужно проанализировать SQL-запрос и интерпретировать AST, чтобы преобразовать его в дерево выражений linq. Это не тривиально, поскольку Linq несовместим с sql: 1: 1. Например, в linq агрегаты в groupby являются внешними по отношению к groupby, а в SQL они являются внутренними: они должны находиться в одной области видимости. как группа, иначе они не будут работать. Этот вид информации необходим для преобразования запросов linq в запросы SQL, а также наоборот.

Таким образом, для хранения запросов я бы выбрал другой маршрут, например, образец спецификации

1 голос
/ 21 мая 2009

Я не верю, что в LINQ-to-SQL есть что-то встроенное.

Теоретически, осмелюсь сказать, что это было бы возможно (хотя это не гарантировало бы обратное использование, поскольку существуют разные способы выражения одного и того же запроса), но это очень трудно сделать.

0 голосов
/ 21 мая 2009

Вещь, которая может вам помочь - LINQPad. Полагаю, он не может перевести SQL в запрос LINQ, но может перевести LINQ в SQL.

Одним из вариантов будет отслеживание сгенерированного SQL кода IL. Например:

SELECT TOP (50) [t0].[Id], [t0].[tralala]
FROM [pamparam] AS [t0]

Генерирует:

IL_0001:  ldarg.0     
IL_0002:  call        LINQPad.User.TypedDataContext.get_pamparam
IL_0007:  ldc.i4.s    32 
IL_0009:  call        System.Linq.Queryable.Take
IL_000E:  call        LINQPad.Extensions.Dump

Таким образом, совершенно очевидно, что запрос LINQ будет выглядеть так:

pamparam.Take (50)
...