Dr. Friedrich
Какая-то хитрющая оконная функция?
Dr. Friedrich
Из вот этих вот lag, lead и всего этого добра?
Pavel
оно там в ссылке `where i = any (values (500),(501),(502),(503),(504),(505),(506),(507),(508),(509),(510),(511),(512),(513),(514),(515),(516),(517),(518),(519),(520),(521),(522),(523),(524),(525),(526),(527),(528),(529),(530),(531),(532),(533),(534),(535),(536),(537),(538),(539),(540),(541),(542),(543),(544),(545),(546),(547),(548),(549),(550),(551),(552),(553),(554),(555),(556),(557),(558),(559),(560),(561),(562),(563),(564),(565),(566),(567),(568),(569),(570),(571),(572),(573),(574),(575),(576),(577),(578),(579),(580),(581),(582),(583),(584),(585),(586),(587),(588),(589),(590),(591),(592),(593),(594),(595),(596),(597),(598),(599),(600)) `
Dr. Friedrich
Хера а так можно что ли?
Pavel
в постгресе много что можно. даже jsons парсить
Dr. Friedrich
Ну круто, да.
Dr. Friedrich
Но это именно тот вопрос, который я и обсуждаю
Dr. Friedrich
in (a, b, c) — фуфел и хрень
Dr. Friedrich
Потому что тут N параметров
Dr. Friedrich
И везде это будет работать плохо без ухищрений
Nikolay
О, я нашёл реализацию: https://stackoverflow.com/questions/50669574/ef-core-find-method-equivalent-for-multiple-records
Dr. Friedrich
any (array (a, b, c)) — хорошо, потому что тут один параметр-массив.
Pavel
in (a, b, c) — фуфел и хрень
точнее его конкретные реализации. согласись что any от него практически не оличается
Dr. Friedrich
Везде
Dr. Friedrich
Я пока не видал хорошей реализации-то
Dr. Friedrich
О, я нашёл реализацию: https://stackoverflow.com/questions/50669574/ef-core-find-method-equivalent-for-multiple-records
Надеюсь, ты код из поста не собираешься использовать в хайлоаде
Dr. Friedrich
Выглядит прям нуваще ужасно
Dr. Friedrich
В смысле, что там много чо можно закэшировать и сделать более типобезопасно
Dr. Friedrich
Да, конечно, сам конкретный экспрешен с замкнутым списком идентификаторов тебе в любом случае придётся аллоцировать, это ок
Dr. Friedrich
Но всё остальное можно закэшировать норм
Viacheslav
Потому что F# один хер не поддерживает LINQ
А QueryBuilder не с IQueryable работает?
Dr. Friedrich
Оно медленно?
Что медленно?
Dr. Friedrich
А QueryBuilder не с IQueryable работает?
Вроде да, под копотом он делает LINQ-запрос.
Nikolay
Что медленно?
Создание экспрешена с замыканием
Dr. Friedrich
Dr. Friedrich
Ну ты же понимаешь, это просто выделить память
Nikolay
С чем сравниваем?
Ну без создания эксрпешена)
Nikolay
А, ну так да, он же не компилирует его по сути
Dr. Friedrich
Ну без создания эксрпешена)
Создать экпрешен — примерно в бесконечное количество раз медленнее, чем не создвать экспрешен
Dr. Friedrich
Соре, я понимаю, что ответ быссмысленный, но не могу дать ничего лучше
Nikolay
Это пздц
Dr. Friedrich
Nikolay
Ещя разберусь
Nikolay
Я уже потерял нить :D
Dr. Friedrich
Мне всегда было интересно, отличается ли Find(id) от .Where(x => x.Id = id).First()
Dr. Friedrich
Возможно, кэши по-разному отработают?
Dr. Friedrich
Нормальны бы человек заюзал это и не парился
Там же просто через рефлекшометр вызывают Contains?
Dr. Friedrich
Почему не писать в запросах сразу Contains?
Nikolay
Там же просто через рефлекшометр вызывают Contains?
Там экспрешн генерируют через Contains
Dr. Friedrich
Там экспрешн генерируют через Contains
Там генерируют экспрешен с контейнсом, так?
Nikolay
Да
Nikolay
Но грязновато
Dr. Friedrich
Ну вот а чо в запросе сразу не написать контейнс?
habib
Мне всегда было интересно, отличается ли Find(id) от .Where(x => x.Id = id).First()
первый работает так: ищет в контексте, если не находит - обращается в базу. .Where(x => x.Id = id).First() - всегда обращается в базу
Dr. Friedrich
Ок, я так и думал
Dr. Friedrich
Я хочу GenericRepository :)
А я не хочу, имхо это дурной паттерн
Dr. Friedrich
Хочется леща прописать
habib
Кстати, можно немного проще написать, типа так: items.Where(x => ids.Contains(x.Id))
проще это использовать. проблема-то никуда не девается в FindMany
Nikolay
А я не хочу, имхо это дурной паттерн
Ты про паттерн репозиторий?
Dr. Friedrich
Ты про паттерн репозиторий?
Нет, про генерик репозиторий
Dr. Friedrich
«Репозиторий, который подойдёт всем»
Dr. Friedrich
Нет, не подойдёт.
Dr. Friedrich
В половине случаев это просто лишний код и обуза
Dr. Friedrich
А во второй половине случаев его всё равно недостаточно
Dr. Friedrich
Так зачем нам нужен токой генерик?
Nikolay
Так реализация репозиториев же одинаковая для всех
Dr. Friedrich
Нет, не одинаковая.
habib
DbSet<T> - реализация репозитория
Dr. Friedrich
Для ~70% репозиториев мне не нужно искать объекты по id
Dr. Friedrich
Для ~95% репозиториев мне не нужно искать объекты по списку id
Dr. Friedrich
Плюс это и неэффективно, на самом деле
Dr. Friedrich
В моём мире каждый запрос вручную тюнится и поддерживается
Dr. Friedrich
И, да, GraphQL я не писал, и я вижу, для чего там могут потребоваться генерик репозитории, окей
Nikolay
В моём мире каждый запрос вручную тюнится и поддерживается
Ну в моём тырыпрайз мире вообще нет репозиториев 🌚
Nikolay
Вот только я в GraphQL не совсем понимаю прикол, получается вместо одного запроса с JOIN мы просто делаем 100500 запросов
Nikolay
Или там вся надежда на HighLoad и кэши DataLoader'a?
Vasily
Graphql удобно с т.з. фронта, но бэк на нем страшноват, конечно
Dr. Friedrich
Или там вся надежда на HighLoad и кэши DataLoader'a?
Не знаю таких, и не вижу, какая надежда на них может возлагаться.