Преобразуйте SQL-запрос обратно в выражение Linq программно

StackOverflow https://stackoverflow.com/questions/891682

Вопрос

Можно ли каким-то программным образом преобразовать 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)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top