Лучший способ написать динамический запрос с динамическим результатом с помощью Linq или Expression Tree - PullRequest
1 голос
/ 14 сентября 2011

Я ищу лучший способ написать запрос с помощью LINQ или дерева выражений, чтобы вернуть динамический результат в соответствии с динамическим вводом.Например, рассмотрим этот псевдокод:

CREATE PROCEDURE Test
@Input      NVARCHAR(50)
AS
BEGIN
DECLARE @Query      NVARCHAR(100);
SET @Query=N'SELECT ' + @Input + ' FROM MyTable'

EXEC @Query
END

Как лучше всего:

  1. Кодировать это с помощью LINQ или дерева выражений
  2. Вызывать это как сохраненныйпроцедура с использованием LINQ to SQL

EDIT 1)

Рассмотрим каждый динамический запрос, не включающий оператор SELECT. Например, недавно я написал динамический PIVOT query.So я не могу использовать Dynamic LINQ

1 Ответ

1 голос
/ 15 сентября 2011

Динамический Линк?Вероятно, нет

Я собирался предложить Dynamic Linq , но, как говорится в вашем «Правке», это вам не подойдет.

В этом случае я бы сказал, чтоОтвет на ваш вопрос: «Нет лучшего пути».

Является ли Linq лучшим выбором для этого?

Ваш вопрос задает Linq, в частности, Linq to Sql, реализацию того, какчтобы достичь ваших динамических запросов.

Но подумайте, для чего предназначен Linq to Sql.Основные преимущества, которые приходят на ум от Linq to SQL:

  1. Строго типизированные запросы (перехват ошибок во время компиляции)
  2. Строго типизированные результаты.Имеется в виду хорошие заранее написанные классы (в случае с Linq для SQL, предварительно сгенерированные)

Теперь, если вы выполняете операторы "Select" и всегда возвращаете фактическую сопоставленную таблицу, то нет никаких причин, по которым вы можете это сделатьне используйте динамическую библиотеку Linq.

Но если вы возвращаете произвольные не отображенные результаты, нет смысла использовать LINQ, на самом деле это не позволит вам.

DataContext.ExecuteQuery<T>(string query)

У класса DataContext есть метод ExecuteQuery<T>, но, к сожалению, вы не можете вернуть динамический параметр как T: - (

Linq для SQL и хранимых процедур

Наконец, LINQ to SQL может отображаться на хранимые процедуры. Таким образом, вы можете иметь хранимую процедуру, которая принимает запрос в качестве аргумента, как ваш пример. Однако я считаю, что он имеет те же ограничения ExecuteQuery с точки зрения типов в canрезультат, хотя не держите меня на этом.

Я бы посмотрел на это как на последний вариант и изучил sproc в конструкторе Linq to SQL, возвращающем либо анонимный, динамический, либо сопоставленный тип.

...