
Vasily
15.05.2017
13:28:34
Нету, естественно

Friedrich
15.05.2017
13:29:09
Зато есть на query expressions: https://fsprojects.github.io/SQLProvider/core/querying.html
Норм, вот это то что нужно. SQLProvider — добро :)
Я всё забываю его поюзать. Надо бы взяться

Google

Vasily
15.05.2017
13:29:40
Только наружу экспрешн не вытащишь

Friedrich
15.05.2017
13:29:56
А вроде их можно же было композировать.

Илья
15.05.2017
13:31:28
Ну и чтобы строчка проверялась на корректность структуре базы
Вообще это реализуемо. Если бы сделали так чтобы студия брала данные для подключения к БД из того же файла который юзается чтобы подключаться к БД из кода (App.config или типа того). Тогда она могла бы валидировать строки с SQL кодом. Я например видел - сейчас студия начала подсвечивать строки с регулярками. Значит и строки с SQL тоже наверняка можно распознать.

Vasily
15.05.2017
13:32:12

Friedrich
15.05.2017
13:32:12
(но я согласен, что вопрос с билдами даже более первичен)

Vasily
15.05.2017
13:33:17
Тулинг хрен бы с ним

Igor
15.05.2017
13:33:20

Vasily
15.05.2017
13:33:27
Компайл тайм куда важнее

Илья
15.05.2017
13:34:41
Странно, чет сообщения подвисают и отправляются через несколько минут повторно. А иногда сразу дублируются.
Юзаю веб-версию телеги

Evgeniy
15.05.2017
13:35:02
@fvnever А Scalike работает на этих хитрых строковых литералах?

Google

Friedrich
15.05.2017
13:35:08

Evgeniy
15.05.2017
13:35:20
Угу.

Vasily
15.05.2017
13:35:24
У меня так винфоновский клиент работает

Evgeniy
15.05.2017
13:36:01
@fvnever Хорошая фича, я бы хотел что-то такое в F#.
С другой стороны, конечно, уже есть провайдеры.

Friedrich
15.05.2017
13:36:28
Провайдеры делают вторую половину работы. Тоже очень важную.

Evgeniy
15.05.2017
13:37:04
@fvnever А давай подробнее.

Vasily
15.05.2017
13:37:24
ИМХО, две ключевых фичи должно быть - compile time sql check и автомаппинг на типы
И сразу жить станет веселей и проще

Evgeniy
15.05.2017
13:38:03
@fvnever За что в scalike отвечает интерполяция и sql литералы?

Vasily
15.05.2017
13:38:11
Особенно если еще типы выводить из sql query result

Friedrich
15.05.2017
13:38:21
@fvnever А давай подробнее.
ScalikeJDBC не делает компил-тайм валидации. Это только фреймворк для конструирования и параметризации запросов. Умеет композировать их из кусочков и подставлять параметры за счёт интерполяции. И всё.

Ivan
15.05.2017
13:38:58
http://stackoverflow.com/questions/30753512/intellij-idea-syntax-highlighting-of-sql-inside-java-code

Evgeniy
15.05.2017
13:39:14
@fvnever Я правильно понимаю, что мы можем сделать аналог в F#, но без интерполяции? Но через printf-like функции.

Ivan
15.05.2017
13:39:26
Так что это фишка IDEA, а не решарпера. И она там есть

Friedrich
15.05.2017
13:39:42

Evgeniy
15.05.2017
13:40:59
Я бы не сказал.

Artemy
15.05.2017
13:46:34
Норм, вот это то что нужно. SQLProvider — добро :)
К сожалению, там не все конструкции запросов пока поддерживаются. Вот, например, недавно с такой проблемой столкнулся:
https://github.com/fsprojects/SQLProvider/issues/396
+ ещё с groupBy дела не очень.
В результате, перешёл на http://fsprojects.github.io/FSharp.Data.TypeProviders
Вот сейчас решил ещё попробовать http://fsprojects.github.io/FSharp.Data.SqlClient/
Читал, что его где-то реально использовали/используют. И что типа он хорош. Кстати, вероятно, тут есть кто-то, кто может поделиться мнением о нём?

Google

Vasily
15.05.2017
13:52:07
Ну я попробовал. В Bulk insert умеет

Alexey
15.05.2017
13:53:34
Мы его в проекте юзаем, пока нареканий ннт

Vasily
15.05.2017
13:54:24
Ща время будет, попробую в продакшне

Friedrich
15.05.2017
13:54:31

Alexey
15.05.2017
13:55:22
АРМ для нефтянки

Friedrich
15.05.2017
13:55:38
На F#?! Ох нифига!

Nikolay
15.05.2017
13:56:32

Artemy
15.05.2017
13:56:45

Friedrich
15.05.2017
13:56:52

Vasily
15.05.2017
13:57:20
У меня ща просто сильно подгорает

Nikolay
15.05.2017
13:57:26
1.5 тб диск на сервере в 2017, как это больно :(

Alexey
15.05.2017
13:57:27
Ну на f# маленькие кусочки,т.к. f# толкнул совсем недавно и приложение на wpf

Vasily
15.05.2017
13:57:48
То, что на f# отрабатывало 10 секунд с балк инсертом
На NHibernate процессилось пару часов
И это удручает

Alexey
15.05.2017
13:58:23
Ну балк инсерт можно было и на голом afo.net сделать

Friedrich
15.05.2017
13:58:23
?

Vasily
15.05.2017
13:58:26
Как, впрочем, и размер кода

Alexey
15.05.2017
13:58:33
Тут не заслуга f#

Google

Vasily
15.05.2017
13:58:39
Не заслуга
Но заслуга в автогенеренных типах

Artemy
15.05.2017
13:59:30

Alexey
15.05.2017
13:59:58
Ну да, только вот из-за erasure приходится писать обертки для информации Европа с c#

Vasily
15.05.2017
14:00:05
Так что лично мне Sql provider сильно понравился

Alexey
15.05.2017
14:00:21
Работы с с#*

Vasily
15.05.2017
14:00:22
Правда, если импользуете spatial types
в базе
Придется поприседать :)

Илья
15.05.2017
14:08:10
Продолжаю читать учебник по фишарпу. Возник такой вопрос. Как понимать это выражение?
let rec listLength theList =
match theList with
| [] -> 0
| [_] -> 1
| [_; _] -> 2
| [_; _; _] -> 3
| hd :: tail -> 1 + listLength tail
Я уже читал про сопоставление с образцом. Мне непонятно что такое hd :: tail. Кажется это что-то связанное со списками, но все равно чет никак не пойму...

Admin
ERROR: S client not available

Vasily
15.05.2017
14:08:29
стандартное представление списка

Илья
15.05.2017
14:08:47

Doge
15.05.2017
14:08:58
hd - первый элемент списка
tail - оставшийся список

Илья
15.05.2017
14:09:22

Vasily
15.05.2017
14:09:23
Еще можно посмотреть на List.head
Ну это значит, что больше 3 элементов

Artemy
15.05.2017
14:09:38
Звучит воодушевляюще. Спасибо. :)
Мы его в проекте юзаем, пока нареканий ннт
АРМ для нефтянки

Google

Vasily
15.05.2017
14:09:46
Судя по предыдущим матчерам

Илья
15.05.2017
14:10:06
hd и tail это что переменные???

Vasily
15.05.2017
14:10:13
Ну да

Илья
15.05.2017
14:10:16
ну точнее константы)

Doge
15.05.2017
14:10:31

Friedrich
15.05.2017
14:10:33

Илья
15.05.2017
14:10:37
а зачем там ::

Vasily
15.05.2017
14:10:58
Это cons

Friedrich
15.05.2017
14:11:16
а зачем там ::
Квадратные скобки не умеют сматчить список произвольной длины. [a; b] это список длины 2, и всё тут. А вот a :: tail это список любой длины больше 0.

Artemy
15.05.2017
14:11:47
:: - типа оператор добавления элемента в список

Илья
15.05.2017
14:12:05

Friedrich
15.05.2017
14:12:09
Правильнее всё-таки назвать его "конструктором списка"
И тогда появляется аналогия с конструкторами union'ов.

Vasily
15.05.2017
14:12:45

Илья
15.05.2017
14:13:07
Черт, не понимаю... ?

Artemy
15.05.2017
14:13:25
Ну мне так видится,по крайней мере.
Поэтому и написал "типа оператор". :)

Friedrich
15.05.2017
14:14:21
Вот именно. А тут то вроде нету никакого добавления
Использование всех этих паттернов тут следует понимать как "объект, сконструированный выражением таким-то".
Например, под паттерн [a; b] подходит объект, сконструированный этим выражением — например, [1; 2]. В этом случае hd :: tail — это объект, сконструированный с помощью конструктора списка. Например, 1 :: [2; 3; 4] является таким объектом, и потому подходит под этот паттерн.

Artemy
15.05.2017
14:15:00
x :: xs - по смыслу то же самое, что и [x] @ xs, где @ - оператор конкатенации списков, а xs - список.

Pavel
15.05.2017
14:15:38

Artemy
15.05.2017
14:15:51
Ну не то же самое, а производит тот же результирующий список.

Friedrich
15.05.2017
14:15:52