Имя: Пароль:
IT
 
Лямбда функции
, , ,
0 Почему 1С
 
12.02.21
14:20
Может вопрос не по профилю форума, но видел подобные вопросы по compscience.
В общем вопрос такой, кто посоветует материал (курсы , книги), чтобы освоить лямбда функции, сами то они просты, но видимо требуют особого понимания как научится мыслить ими.
Я могу читать и понимать код состоящий из каскада лямбда функций, но вот сам так писать не могу (всегда скатываюсь классический код без функциональщины), а хочу практики чтобы набить руку и при этом делать это правильно.
Если кто имеет опыт буду благодарен если поделитесь.
147 ДенисЧ
 
15.02.21
16:29
(146) Память и процессор нынче не ресурс, пора привыкнуть. Для того, чтобы 2+2 посчитать - нужен минимум i9
148 Доктор Манхэттен
 
15.02.21
17:43
(139) Лямбды в любом случае нужно отлаживать. А как отладить промежуточные результаты циклов? Никак. Поэтому нужно разбивать на отдельные шаги, а не лепить все в один цикл.
149 Serginio1
 
15.02.21
18:05
(148) Ты SQL запросы также отлаживаешь?
Еще раз Linq для коллекций это дополнительный бонус. Основное это SQL запросы.
Но если ты привык мыслить циклами, то декларативное программирование не для тебя.
150 Ненавижу 1С
 
гуру
15.02.21
18:06
151 Доктор Манхэттен
 
15.02.21
18:08
(149) Мы не про SQL запросы говорим. Если не видишь разницы, то функциональное программирование не для тебя.
152 Ненавижу 1С
 
гуру
15.02.21
18:09
(151) почему то мне кажется ты тролль
153 Вафель
 
15.02.21
18:10
вот именно что отладка скл запросов это боль
154 Доктор Манхэттен
 
15.02.21
18:10
(152) Когда кажется, крестятся.
155 Serginio1
 
15.02.21
18:18
(151) Самому то не смешно? Мы говорим про Linq. Он имеет SQL подобный синтаксис смотри (133)
вот два одинаковых запроса
первый SQL подобный
Var numQuery1 =
            from num in numbers
            where num % 2 == 0
            orderby num
            select num;
Второй обычный
        //Method syntax:
        var numQuery2 = numbers.Where(num => num % 2 == 0).OrderBy(n => n);

Если в качестве источника будет выступать не IEnumerable а таблица БД IQueryable то будет запрос к таблице
Вот пример
http://catalog.mista.ru/1c/articles/402433/

(153) Linq помогает склеивать запросы. И это удобнее чес склеивать текстовые запросы.
Отладив поодиночке можно их собирать.
156 Доктор Манхэттен
 
15.02.21
20:26
(155) А, это хрень для запросов. Тогда извиняюсь, ошибся. Я думал мы говорим про функциональное программирование.
157 Serginio1
 
15.02.21
20:56
(156) >> Но если ты привык мыслить циклами, то декларативное программирование не для тебя.
https://ru.wikipedia.org/wiki/Language_Integrated_Query
LINQ к объектам
Представляет собой не что иное, как функциональное программирование, замаскированное под синтаксис SQL[8].
158 Serginio1
 
15.02.21
21:11
157+ https://rsdn.org/article/dotnet/LinqAsStapToFp.xml#EZFAC
Многим может показаться странным то, что ФП в LINQ замаскировано под SQL. Однако это не просто маскировка. Идеи ФП нацелены на то, чтобы сделать программирование более декларативным. Программируя в стиле ФП, мы как бы описываем то, что хотим получить, а не то, как мы это хотим получить. Именно это призван делать и SQL. SQL – это язык запросов, с помощью которого мы лишь описываем, что хотим выбрать из БД (или как хотим ее изменить), но при этом мы не задаем конкретный (императивный) алгоритм обработки данных.
159 Вафель
 
15.02.21
21:57
а вот интересно. если в линк какую-нибудь функцию подсунуть что скл не поддерживает, то как оно в запрс транслируется?
160 Serginio1
 
15.02.21
22:04
(159) Там не функция а деревья выражений, хоть синтаксис и один. https://docs.microsoft.com/ru-ru/dotnet/csharp/programming-guide/concepts/expression-trees/
При обработке дерева выражений провайдером выдаст ошибку
161 Serginio1
 
16.02.21
00:01
(141)>> От количества циклов тут мало что зависит. Это доли миллисекунды. Тормоза тут не в циклах, а в медленных вызовах через интерфейс и замыкания всякие.
А для промежуточных результатов нужно выделять дополнительные списки и значит дополнительные расходы на память и Add в список.
Ну и конечно сравнивать инлайный   if (d < 100) count++; не совсем правильно. При сравнении строк уже разница будет минимальна.
Не говоря уже о group by, sort by, Select
162 Доктор Манхэттен
 
16.02.21
00:19
(155) По сути ничего не поменялось. Ну раскрыли скобки, убрали точки. Синтаксис немного поменялся, но в остальном все так же.
163 Кирпич
 
16.02.21
08:12
(161) "Ну и конечно сравнивать инлайный   if (d < 100) count++; не совсем правильно."
Схрена ли неправильно. Очень даже правильно. Если большие объемы данных и нужна скорость, то linq использовать нельзя (если это не для SQL). Это же ясно как день.
А то, что c Linq всё красиво и понятно - это тоже вопрос. Когда по одной строчке в лямбду, то да. А если по 100 строк, то вся красота и понятность исчезает и остаются только тормоза.
164 Доктор Манхэттен
 
16.02.21
08:20
(163) В лямбду и без Linq можно, см пример (155):

var numQuery2 =
            numbers
            .Where(num => num % 2 == 0)
            .OrderBy(n => n);

Это даже короче и понятнее чем link:

Var numQuery1 =
            from num in numbers
            where num % 2 == 0
            orderby num
            select num;
165 Кирпич
 
16.02.21
08:22
(161) "А для промежуточных результатов нужно выделять дополнительные списки"
А нафига промежуточные результаты? Я так же могу всё сделать в одном цикле и выделить память только под конечный результат. Можно все сделать так же как в linq, только без лишних вызовов виртуальных методов.
166 Почему 1С
 
16.02.21
09:02
(165) Нужно просто красиво и с легкой поддержкой кода, быстро тоже нужно но в последнюю очередь. Я хоть и не умею еще писать подобное, но вот в чужом коде гораздо быстрее могу разобраться  если он написан в функциональном стиле(условно). От того и интерес к этим лямбда выражениям
167 Кирпич
 
16.02.21
09:23
(166) "быстро тоже нужно но в последнюю очередь."
Быстро нужно когда надо, а не в последнюю очередь. Если тебе JSON гонять двум пользователям, то пожалуйста. А если у тебя игровой движок или какая нибудь 3D модель урагана Катрина, то совсем другое дело.
168 Ненавижу 1С
 
гуру
16.02.21
09:36
(167)     Преждевременная оптимизация — корень всех зол. Дональд Кнут.
169 Кирпич
 
16.02.21
09:38
(168) Правильно. Пускай 1С открывается по 5 минут. Зато всё по Кнуту :)
170 Кирпич
 
16.02.21
09:41
(168) Да и Кнут это написал, когда оптимизацией считалось переписывание куска программы на ассемблере
171 Почему 1С
 
16.02.21
09:43
(167) А почему тогда для ураганов катарина, ИИ, дата майнига и других научных вычислений так популярен Питон, который совсем не про скорость выполнения.
(169) Я сейчас имею дело с конфой на 1С, которая по моим понятиям должно просто жестко висеть потому как очень много всего сделано не оптимально и не правильно сточки зрения практик и рекомендаций, но SQl каким то образом вытягивает это поделие до работоспособного состояния.
172 Кирпич
 
16.02.21
09:44
(171) "других научных вычислений так популярен Питон"
потому что в питоне используются библиотеки написанные на Си
173 Почему 1С
 
16.02.21
09:49
(172) Ну вот, острые умы найдут как оптимизировать высокоуровневый код которым будут пользоваться люди с умом попроще в LInq лямдах и питонах и всем будет хорошо
174 Serginio1
 
16.02.21
10:38
(164) Ты написал два вида Linq. Какой хочешь такой и используй.
Нередко приходится использовать 2 синтасиса.
Опять же SelectMany проще и понятнее использовать в Sql синтаксисе
var selectedUsers = from user in users
                    from lang in user.Languages
                    where user.Age < 28
                    where lang == "английский"
                    select user;
Для создания аналогичного запроса с помощью методов расширения применяется метод SelectMany:

var selectedUsers = users.SelectMany(u => u.Languages,
                            (u, l) => new { User = u, Lang = l })
                          .Where(u => u.Lang == "английский" && u.User.Age < 28)
                          .Select(u=>u.User);
Правда в Sql подобном синтаксисе есть let очень удобная вещь
https://docs.microsoft.com/ru-ru/dotnet/csharp/linq/group-query-results

https://docs.microsoft.com/ru-ru/dotnet/csharp/language-reference/keywords/let-clause
string[] strings =
        {
            "A penny saved is a penny earned.",
            "The early bird catches the worm.",
            "The pen is mightier than the sword."
        };

        // Split the sentence into an array of words
        // and select those whose first letter is a vowel.
        var earlyBirdQuery =
            from sentence in strings
            let words = sentence.Split(' ')
            from word in words
            let w = word.ToLower()
            where w[0] == 'a' || w[0] == 'e'
                || w[0] == 'i' || w[0] == 'o'
                || w[0] == 'u'
            select word;
175 Serginio1
 
16.02.21
10:44
(165) Нужна скорость используй Linq Rewriter или LinqOptimizer. Только вот таких людей не очень много.
Не нужна экономия пару тактов.
Ну и конечно же ты пишешь на С++, ибо на 1С и питоне про инлайнинг не знают. А в 1С и о замыканиях и не знают, не то, что о Linq
176 Serginio1
 
16.02.21
10:57
174+ tot into
https://docs.microsoft.com/ru-ru/dotnet/csharp/language-reference/keywords/into

from row in rows
            select row.Split(',') into columns
            let identifier = columns[0].Replace("Prefix_", string.Empty)
            group columns by identifier into g
            select new Log {
                  Identifier = g.Key,
                  DurationInSeconds = (from dur in g
                                      let duration = DateTime.Parse(dur[1])
                                      select duration.Hour * 3600 + duration.Minute * 60
                                              + duration.Second).Sum()
                           }
177 Uberschall
 
16.02.21
12:08
между делом спрошу, вдруг кто посоветует книгу для котлина по корутинам?
178 Uberschall
 
16.02.21
12:15
(175) по поводу оптимизации я выше писал, что есть разница между inline  и не inline функциями (замыкания на не inline тратят время на создание оберток). по поводу циклов: есть возможность (не знаю как в C#) не создавать промежуточные выгрузки, а использовать отложенные операции через секвенции. При желании можно дальше пойти и использовать сплитераторы и многопоточную обработку stream'ов для java (но не все можно раздробить- это вопрос конурентности).  Ну и не стоит забывать, что кроме оптимизации есть стоимость поддержки. Для декларативного стиля это большой плюс по сравнению с императивным- но это уже переход в DSL.
179 Garykom
 
гуру
16.02.21
12:25
(177) не тупи какие к черту корутины на котлине если основное применение котлина это трансляция в java совместимый байт код
короче книги по java и многопоточности в зубы и вперед
180 Uberschall
 
16.02.21
12:27
(179) это понятно. но хочется тему раскрыть для себя, чтобы, если зайдет обсуждение, понимать что там происходит.
181 Кирпич
 
16.02.21
12:34
(177) Кто будет писать книги про корутины. На хабре статью прочитай и хватит. https://habr.com/ru/company/alfa/blog/336228/
182 Uberschall
 
16.02.21
12:37
(181) да, видел статью, но после java concurency (библиотека или книга) как-то не густо...
183 Почему 1С
 
16.02.21
13:04
(177) какое то своеобразное у тебя понимание применения котлина Kotlin > Java, это как сказать зачем тебе c++ когда он всего лишь переводит в машинный код.
184 Почему 1С
 
16.02.21
13:06
(182) Теория параллельных вычислений это одно, а конкретная реализация их в языке это более узкая тема которая действительно не стоит отдельной книги.
185 Serginio1
 
16.02.21
13:42
Мне в котлине понравилось легкое создание DSL. Например аналог lock в kotlin — можно реализовать просто функцией, а не отдельной языковой конструкцией:

lock(syncRoot) {
   doWork();
}


https://kotlinlang.org/docs/reference/type-safe-builders.html
186 Garykom
 
гуру
16.02.21
13:49
(185) дык Java же
187 Почему 1С
 
16.02.21
13:52
(186) хочу видеть как этот код ты скомпилишь на java
188 Garykom
 
гуру
16.02.21
13:56
(187) https://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html

как бы наоборот котлина в яву "компилится"
189 Почему 1С
 
16.02.21
14:18
я про реализацию DSL не про конкретно lock, то есть synchronized это конструкция языка а lock это функция с лямбда параметром, а внутри скорее всего и сидит synchronized
То что Kotlin ограничен JVM не спорю, просто у него уровень абстракции выше и красивее все реализовывается
190 Uberschall
 
16.02.21
15:04
(183) а что в этом странного? Kotlin создавался на основе  Java, за основу были взяты её библиотеки, требовалась прямая поддержка.
(189) реализация DSL (да и вообще большей части Kotlin) исходит из соглашений, позволяющих составлять синтаксические конструкции. те же инфиксные вызовы типа 1 to "one", можно делать в более традиционном стиле типа 1.to("one") из java и наоборот.
"а внутри скорее всего и сидит synchronized" - совсем не факт. synchronized построен на мониторе, а Lock- на парковке потока.
191 Uberschall
 
16.02.21
15:06
(187) чтобы понять как перевести в более традиционный вид, здесь недостаточно информации. тут вообще lock может быть экземпляром объекта, для которого определен метод invoke (соглашение)...
192 Почему 1С
 
16.02.21
15:19
(191) ну тут фишка что последний параметр типа лямбда можно передавать не как параметр а описывать телом этой самой функции. Lock тут я понимаю как функцию
fun lock(par:Any, todo:()->Unit){
    synchronized(par) {
        todo()
    }
}
193 Serginio1
 
16.02.21
15:20
(190) lock это Monitor в try finally
https://stackoverflow.com/questions/2837070/lock-statement-vs-monitor-enter-method

System.Threading.Monitor.Enter(x);
try { ... }
finally { System.Threading.Monitor.Exit(x); }
194 Почему 1С
 
16.02.21
15:20
Реализация функции естественно может быть любой, что тоже даст уровень абстракции в будущем
195 Serginio1
 
16.02.21
15:21
Вот все что в try{...} и есть лямбда,
196 Uberschall
 
16.02.21
15:38
(192) возможно.
(193) в java synchronized может быть либо методом, либо локальным блоком.
скорее всего имелось ввиду что-то такое или как в (192)

fun lock(syncRoot: Lock, action: ()->Unit){
lock.lock()
try{action()}
finally{lock.unlock}
}
вызов:
val syncRoot = Lock()
lock(syncRoot){prinln("внутри блокировки")}

в общем, особо никаких проблем с вызовом из java
197 Почему 1С
 
16.02.21
15:41
(196) Java так умеет lock(syncRoot){prinln("внутри блокировки")}?
198 Uberschall
 
16.02.21
15:42
(197) lock(syncRoot, prinln("внутри блокировки")) -  то же самое
199 Почему 1С
 
16.02.21
15:47
(198) что возвращает println? ))) но суть не в этом, а в том что в  Котлин это реализовано красиво, хотя по функциональности может быть тем же самым
200 Uberschall
 
16.02.21
15:53
(199) соответствует сигнатуре параметра ()->Unit. println- стандартный метод, ничего не возвращает (в терминах Kotlin- это Unit).
201 Почему 1С
 
16.02.21
16:00
Ну тебе нужна функция как параметр а ты передал ничего (передал результат println)
202 Uberschall
 
16.02.21
16:06
(201) это не так работает. ()->Unit   <=> ()->{что-то возвращающее Unit или ничего (Unit - аналог void)} <=> ()-> {println()} <=> {println()}
203 Почему 1С
 
16.02.21
16:13
Где в (198) определение лямбда выражения?
204 Uberschall
 
16.02.21
16:17
(203) точно, тупанул. для java придется лямбду развернуто написать:
lock(syncRoot, ()->System.out.println("внутри блокировки"))
205 Почему 1С
 
16.02.21
16:21
Вот, а если речь про dsl то в java это будет выглядеть вырвиглазно а в котлин структурно и красиво, на примере того же html что приводили выше
206 fisher
 
16.02.21
16:21
(0) Я в функциональщине ни в зуб ногой, хотя щупал и замыкания и лямбды.
Но слышал, что для погружения в этот мир берут хорошую книжку по хаскелю.
207 Uberschall
 
16.02.21
16:25
(205) но понимать-то все-равно надо что там происходит.
208 Garykom
 
гуру
16.02.21
16:33
(206) Для погружения достаточно знать что любую лямбду можно заменить на обычную Функцию или Процедуру (с передачей параметров по значению)
Но будет "больше кода" и не так "синтаксически сахарно красиво"
209 Garykom
 
гуру
16.02.21
16:34
(208) тьфу *с передачей параметров по ссылке
210 Serginio1
 
16.02.21
17:17
(208) не всегда. Переменные метода по ссылке не передашь, так как время жизни лямбды может быть больше чем время жизни метода
211 Ненавижу 1С
 
гуру
16.02.21
17:23
(208) вообще нет
1. при замыкании мы конструируем функцию, но вовсе ее не вызываем, возможно вызовем вообще в другом методе, как бы с параметром такое не выйдет
2. нарушилась бы сигнатура функций
212 Почему 1С
 
16.02.21
17:28
(206) Что за книжка, автор или название?
213 Ненавижу 1С
 
гуру
16.02.21
17:34
По крайней мере LINQ мог бы избавить от вот такого:

ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "%УсловиеОрганизация%", УсловиеОрганизация);
214 Garykom
 
гуру
16.02.21
17:36
(210) (211) Дык вы читать то умеете?

ВСЕГДА лямбду можно заменить на вызов процедуры/функции, просто будет не так красиво.
Придется например в временем жизни и сохранением параметров что то допом в коде изобретать да.
215 Garykom
 
гуру
16.02.21
17:38
(214)+ Это как "можно ли программировать не используя GOTO"
Можно! Но иногда с "безусловным переходом по метке" проще. Аналогично с лямбдой.
216 Garykom
 
гуру
16.02.21
17:40
Имхо для простоты поддержки λ=goto
лучше не использовать или новичкам особенно тяжко будет
217 Ненавижу 1С
 
гуру
16.02.21
17:41
(214) и получается скрытый объект с методом в виде самой лямбды и полями в виде переменных замыкания
что собственно и проделывает, например, C#

(215) конечно можно, не используя ЯВНО GOTO, но осознавая что за всеми ветвлениями и циклами лежит JMP
218 Garykom
 
гуру
16.02.21
17:42
Кстати LINQ лишняя ненужная хрень, лучше нативный SQL разрабу подучить с особенностями реализаций конкретных серверов SQL
Или перейти на концепцию NoSQL с MapReduce понимая что это и зачем.

А не извращаться с трансляторами.
219 Ненавижу 1С
 
гуру
16.02.21
17:43
(218) каждому своё
220 Serginio1
 
16.02.21
17:50
(218) Смысл линка, что легким движением руки мы можем сменить СУБД.
При этом возможности Linq to EF значительно больше чем 1С, а Linq2DB еще больше.
https://github.com/linq2db/linq2db
https://linq2db.github.io/articles/sql/Window-Functions-(Analytic-Functions).html

>> Кстати LINQ лишняя ненужная хрень, лучше нативный SQL разрабу подучить с особенностями реализаций конкретных серверов SQL
Ты это расскажи миллионам C# программистам которые эту хрень используют.
Пока еще реляционные базы никто не вытеснит.
221 Garykom
 
гуру
16.02.21
17:59
(220) Смысл SQL в том что легким движением мы можем сменить СУБД
222 Garykom
 
гуру
16.02.21
18:01
(221)+ Достаточно перед каждым вызовом добавить обработку текста sql чтобы особенности конкретной субд учесть
ну там limit или top и прочее типа передачи параметров
короче это пишется за полдня для каждой новой субд
223 Garykom
 
гуру
16.02.21
18:04
(222)+ имхается уже есть готовые написанные модули для трансляции текстов sql запросов между разными популярными субд
224 Доктор Манхэттен
 
16.02.21
18:22
(174) Какой же это link? Первый вариант - это обычная запись, без всякого линка. То что Линк имеет такой же синтаксис - это его проблемы. А я всегда так писал.
225 Serginio1
 
16.02.21
19:31
(221) Угу ты 1С перепиши. Есть еще куча инструкций пригодных только для каждой СУБД.
Посмотри на количество инструкций в 1С. Здесь ты не прав.
(224) Это обыкновенный Linq. То, что есть два типа линк это не проблемы а достоинства.
Посмотри на SelectMany плюс let и into

Кстати на чем писал? И можно склеивать запросы?
var query= list.Where(a=>а.поле>5);

var query2=query.Where(a=>а.поле2>5);
226 Serginio1
 
16.02.21
19:53
(224) в (174) Первый это Sql подобный, а вот второй через методы расширения SelectMany и первый значительно лаконичнее
var selectedUsers = from user in users
                    from lang in user.Languages
                    where user.Age < 28
                    where lang == "английский"
                    select user;
И на чем ты писал?
227 Garykom
 
гуру
16.02.21
20:04
(225) >Угу ты 1С перепиши. Есть еще куча инструкций пригодных только для каждой СУБД.
>Посмотри на количество инструкций в 1С. Здесь ты не прав.

1С переписывать нет смысла а вот использовать лишнюю прокладку нафига?
Один хрен оно в sql транслируется и каким местом эта "куча инструкций"?
На другом ЯП в отличие от нативного SQL хрен используешь и переписывай все заново.
228 Доктор Манхэттен
 
16.02.21
20:12
(225) Зачем тогда было писать, мол: "В линке лучше", если там то же самое что и в обычном программировании?
229 Доктор Манхэттен
 
16.02.21
20:15
(225) На JS можно так склеивать, но склейка происходит по функции "И", а не "ИЛИ".
230 Serginio1
 
16.02.21
20:19
(227) >> а вот использовать лишнюю прокладку нафига?
Для интеллисенса, склеивания запросов.
Например один и тотже подзапрос встречается в несколько раз. В 1С используют временные таблицы или склейку текста, что неудобно.
Кстати на stackoverflow используют Dapper https://github.com/StackExchange/Dapper для предстаавления результата запроса в типизированную коллекцию.
На Linq2DB достаточно богатый язык. А Какие то фичи конкретного SQL языка всегда можно вынести в хранимые процедуры. При замене СУБД только переписать их.

Не прав потому, что Linq используют и очень этим довольны. И те у кто программирует на языках в которых нет Linq согласны, что Линк крутая фича.
(225) Еще раз ты можешь сделать SQL запрос?
У тебя ленивые вычисления?

Это два одинаковых Linq запроса users может быть не только коллекцией, но и таблицей бд
var selectedUsers = from user in users
                    from lang in user.Languages
                    where user.Age < 28
                    where lang == "английский"
                    select user;
Для создания аналогичного запроса с помощью методов расширения применяется метод SelectMany:

var selectedUsers = users.SelectMany(u => u.Languages,
                            (u, l) => new { User = u, Lang = l })
                          .Where(u => u.Lang == "английский" && u.User.Age < 28)
                          .Select(u=>u.User);

И тот и другой запрос может работать как с коллекцией так и с БД.
SQl синтаксис более лаконичный и читаемый
231 Serginio1
 
16.02.21
20:25
(230) Что бы понятнее, что для SQL применяются деревья выражений а не лямбда функции пример расширения  between
https://stackoverflow.com/questions/1447635/linq-between-operator
232 Serginio1
 
16.02.21
20:31
Кстати про линк на JS
https://habr.com/ru/post/261903/
233 Доктор Манхэттен
 
16.02.21
20:32
(230) Из этого я понял что в Linq есть конструкция, которую можно применять как для работы с обычными структурами данных, так и с базами данных, в то время как без Linq приходилось использовать аналогичный синтаксис, но имеющий различия для структур и для БД. Верно?
234 Serginio1
 
16.02.21
20:46
(233) Так скажем до линка все пользовались Ado.Net. Строковые запросы. Ну еще делали типизированные датасеты.
С появлением в 2005 yield стало понятно, что можно  с ними можно многое сделать. Так в 2008 появился Linq как для коллекций IEnumerable, так и для Iqueryable.
Народ с настороженностью к ним отнесся. Новый функциональный подход долго принимали. Кто то принял, а кто то и нет. Но большинство приняли особенно для Sql
В студии для отладки можно было пользоваться локально БД.

Там не то что конструкция. Linq запрос склеивается. И выполняется пока явно не вызовут итератор (foreach,Count итд)
Поэтому можно склеивать запросы, передавать их в функции. Для SQL это деревья выражений которые обрабатывает провайдер и строит SQL запрос
Вот здесь наглядно видно во что преобразуется запрос к таблицам 1С
http://catalog.mista.ru/1c/articles/402433/

Просто компилятор по разному обрабатывает Linq запрос для IEnumerable и IQueryable, хотя на вид они оинаковые

Да для скорости и типизации когда мало запросов например на stackoverflow используют Dapper https://github.com/StackExchange/Dapper для предстаавления результата запроса в типизированную коллекцию.
235 Доктор Манхэттен
 
16.02.21
22:45
(234) Я не использую Ado.Net, так как пишу под Веб на JS. Но там примерно все то же самое.
236 fisher
 
17.02.21
10:06
(212) Real World Haskell, что ли...
237 fisher
 
17.02.21
10:13
Но не поручусь, что именно про эту слышал. Не помню. Но эта выглядит достойным кандидатом ибо изобилует примерами промышленных реализаций. А что еще нужно программисту, как не примеры? :)
238 fisher
 
17.02.21
10:14
Онлайн доступна бесплатно: http://book.realworldhaskell.org/read/
239 fisher
 
17.02.21
10:16
Опа! Оно еще и со свободными комментариями на каждый сниппет и раздел! Очень прикольный формат, как-то не сталкивался с таким.
240 Почему 1С
 
17.02.21
11:39
(239) Спасибо большое! Начал читать, как раз речь про то то что я спрашивал.
Я подозревал что нужно читать что то про функциональное программирование и даже скачал пару книг но они не пошли, а твой вариант очень хорош. Прочитаю поделюсь результатом.
241 Доктор Манхэттен
 
17.02.21
18:02
Так вот ради рекламы какого сайта была затеяна вся эта беседа!
242 fisher
 
17.02.21
18:23
(241) Но красивая же подводочка, согласись!
243 Почему 1С
 
18.02.21
10:46
Почитал книжку не много, начало очень интригующее мол от вас только навыки программирования, ну читаю все понятно , понятно, потом хоп и оказывается что все что было понятно, на само деле не понятно. Перечитываю второй раз, походу функциональное программирование не мое.
244 Garykom
 
гуру
18.02.21
10:59
(243) Попробуй сначала https://ru.wikipedia.org/wiki/Регулярные_выражения изучить
245 Почему 1С
 
18.02.21
11:36
(244) Регулярными выражениями владею, периодически пользуюсь, и из последнего например было "\s+[a-zA-Z0-9а-яА-Я_]+\.[a-zA-Z0-9а-яА-Я_]+\s+В\s*\([^\)]*ВТ_ОтборыПоПрограммам[^\)]*\)" - найти все условия в тексте запроса вида '*.* в (Выбрать ВТ.Программа Из ВТ_ОтборыПоПрограммам как ВТ)'. Конечно писать их на лету не могу, но с отладчиком еще не возникало задач которые бы не смог решить.
246 Serginio1
 
18.02.21
15:30
(243) Это хаскель. Посмотри F# https://docs.microsoft.com/ru-ru/dotnet/fsharp/
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший