Преобразуйте SQL-запрос обратно в выражение Linq программно
-
23-08-2019 - |
Вопрос
Можно ли каким-то программным образом преобразовать sql-запрос в дерево выражений linq?Предполагается, что sql-запрос должен быть сгенерирован этим запросом linq, поэтому я думаю об этом как о неудачной сериализации \ десериализации запросов linq в формат t-sql.
Спасибо.
Решение
Все возможно, просто для этого требуется огромная работа.Проблема в том, что сначала вам нужно проанализировать SQL-запрос и интерпретировать AST, чтобы преобразовать его в дерево выражений linq.Это нетривиально, поскольку Linq не совместим с sql в соотношении 1: 1:например, в linq агрегаты в groupby являются внешними по отношению к groupby, в то время как в SQL они являются внутренними:они должны находиться в той же области видимости, что и groupby, иначе они не будут работать.Такого рода информация необходима для преобразования запросов linq в запросы SQL, но также и наоборот.
Поэтому для хранения запросов я бы выбрал другой маршрут, напримершаблон спецификации
Другие советы
Я не верю, что в LINQ-to-SQL что-то встроено.
Теоретически, я осмелюсь сказать, что это было бы возможно (хотя это не гарантировало бы обхода, поскольку существуют разные способы выражения одного и того же запроса), но очень трудно сделать хорошо.
То, что может вам помочь - 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)