Controllable Query 2.0 с кратким и ясным синтаксисом

6yrop

Спасибо форуму за feedback. У меня две новости. Первая, новый краткий синтаксис. Вторая, объяснение, зачем всё это нужно, на примере публично известного сайта.
Краткий и ясный синтаксис получился благодаря встраиванию Razor и . Минимальный пример, демонстрирующий новый синтаксис, выглядит так:

Работает дебаг по Razor коду.
Пример вызова хранимой процедуры:

где хранимая процедура SP1:

Пример из real world приложения. Разработчик stackoverflow в своем блоге рассказал, какой SQL код работает вот под этой страницей. Ниже приведен код с использованием Controllable Query:

Файл Paging.cshtml:

Остальное:

Отдельное спасибо за конструктивное обсуждение.

mbolik1


Не делай так никогда. Мало того что строки будут выходить не в порядке row_number. Так ещё ты заставляешь БД делать кучу лишних расчётов.

6yrop

 

Мало того что строки будут выходить не в порядке row_number.
 

Да, спасибо за замечание. Конечно, первый запрос надо закончить "ORDER BY RowNumber;". Поправил. Правда для SQL Server 2012 этот вопрос уже не актуален.
Еще надо не забывать, чтобы набор столбцов orderBy образовывал уникальный набор значений для строк. Но я сохранил код, как было в оригинальном блоге. Кстати, "ORDER BY RowNumber;" там тоже нет.
 
Так ещё ты заставляешь БД делать кучу лишних расчётов.

Про какие лишние расчеты ты говоришь?

mbolik1

Про какие лишние расчеты ты говоришь?
О лишней оконной функции. Особенно если поле по которому идёт сортировка индексировано.
Это конечно всё верно для Oracle, но думаю в MS SQL примерно тоже самое.

6yrop

О лишней оконной функции. Особенно если поле по которому идёт сортировка индексировано.
Это конечно всё верно для Oracle, но думаю в MS SQL примерно тоже самое.
Это один из наиболее распространенных вариантов paging-а для SQL Server 2005-2008 http://www.google.com/#q=sql+server+paging
Причем пишут, что внутри SQL Server 2012 происходит тоже самое:
Currently SQL Server developers wishing to implement server-side paging tend to use imperative techniques such as loading a result set into a temp table, numbering the rows, and then selecting out the range they were actually interested in. Others use the more modern ROW_NUMBER and OVER pattern, while some stick to cursors. None of these techniques are not hard, but they can be time consuming and error prone. Moreover they are inconsistent, as each developer has their own favorite implementation.
SQL Server 2012 addresses this by adding true declarative support for data paging. T do this, developers have been given the ability to add an OFFSET and FETCH NEXT option to T-SQL’s ORDER BY clause. Currently these are not performance optimizations, SQL Server is still doing what you would have done manually. But as Dr. Greg Low says in his presentation, the people writing the query optimizer are in a much better position to improve things when they know what you are trying to achieve rather than how you are trying to achieve it.
http://www.infoq.com/news/2012/03/T-SQL-2012
 

Dasar

Работает дебаг по Razor коду
все запросы пишутся в формате .chtml? т.е. их нельзя записать в обычном файле .cs?

mbolik1

Ну да я думал это Oracle. Где можно обойтись просто rownum.

6yrop

все запросы пишутся в формате .chtml? т.е. их нельзя записать в обычном файле .cs?
Запрос пишется так (файл Program.cs):
 
using System;

namespace PropertyExpression.ControllableQuery.Test
{
class Program
{
static void Main
{
DateTime? date = new DateTime(year: 2013, month: 07, day: 21);
var posts = Query<IPost>.New(new {date}, @"
SELECT Id, CreationDate
FROM Post
WHERE 1 = 1
@if (date.HasValue) {
@:AND CreationDate >= @date
}").List;
}
}
}

При запуске CheckAllQueries появляется файл Program_10.cshtml. 10 это номер строки, где стоит вызов метода Query<>.New. Используется CallerLineNumberAttribute.

Был почти рабочий вариант прям по стринге в cs файле дебажиться, но пока я от него отказался.
По поводу .chtml файлов. В .chtml файлах пишутся куски запросов, которые вызываются из Razor кода, например, метод Paging.Get. Такие функции могут использоваться в нескольких запросах. К любому .cs файлу можно сделать одноименный .chtml файл и custom tool CQTool сгенерирует partial класс с helper-методами.

hprt

Да, спасибо за замечание. Конечно, первый запрос надо закончить "ORDER BY RowNumber;". Поправил. Правда для SQL Server 2012 этот вопрос уже не актуален.
это почему?

6yrop

это почему?
теперь в ORDER BY можно писать OFFSET FETCH NEXT, тем самым не требуется извращаться с ROW_NUMBER и писать слова ORDER BY два раза.

hprt

а, ок, я думал, ты другое имеешь в виду

6yrop

Предполагаю, что передачу локальных переменных можно убрать. Будет совсем кратко:

Реализовать это планирую так. Если компиляция запроса падает с ошибкой "The name 'xxx' does not exist in the current context", то в первый аргумент метода New добавляем к анонимному классу свойство 'xxx'. Для точного поиска метода используем из Roslyn метод FindReferencesInDocument. cs-файл, который требует такой обработки отмечаем специальной custom build action.
Оставить комментарий
Имя или ник:
Комментарий: