Как стать автором
Обновить
4
0

Пользователь

Отправить сообщение

Ну почему же, именно для того мы и вкладывали силы в linq2db — чтобы отчеты создавались легко и непринужденно. Это намного эффективней чем клеить строки в хранимках. А уж ETL на нем пилить одно удовольствие.

Мы уже скоро готовы и к таким выкрутасам: https://github.com/linq2db/linq2db/pull/2731
Мир движется и мы не стоим на месте. Бросать LINQ потому-что кто-то решил такое не поддерживать, это не наш путь.

Интересно было прочитать об еще существующих ограничениях EF Core. Точно знаю что в linq2db такое я давно сделал и забыл.


А для EF Core есть интересная библиотека для декомпиляции методов: DelegateDecompiler

Наверное вам будет интересно взглянуть на этот проект https://github.com/evilguest/linq2d
Там же есть ссылка на презентацию. Тут идея кодогенерации с использованием интрисинков и LINQ и дерева выражений.

Никто и не думает о разработчиках Snowflake. В первую очередь это понадобится тем кому не хотется на каждый чих писать запрос, а просто написать типобезопасно без строчек (по следам ваших запросв)


var a = snowflakeClient.QueryScalar("SELECT COUNT(*) FROM EMPLOYEES WHERE TITLE = ?", "Programmer");

var a = db.Employees.Where(e => e.Title == "Programmer").Count();

var b = snowflakeClient.QueryScalar("SELECT COUNT(*) FROM EMPLOYEES WHERE ID = ?", 3);

var b = db.Employees.Where(e => e.Id == 3).Count();

var c = snowflakeClient.QueryScalar("SELECT COUNT(*) FROM EMPLOYEES WHERE ID IN (?,?)", new int[] { 1, 2 });

var c = db.Employees.Where(e => new int[] { 1, 2 }.Contains(e.Id)).Count();

И не заботиться о маппинге


var employees = snowflakeClient.Query<Employee>("SELECT * FROM MASTER.PUBLIC.EMPLOYEES;");

var employees = db.Employees.DatabaseName("MASTER").SchemaName("PUBLIC").ToList();

Параметризацией запросов или literal inlining с эскейпингом займется сам linq2db.


SQL у Snowflake весьма стандартен, написание такого провайдара это не rocket science. Все упирается в то что мы не можем такое поставить на CI — нету у Snowflake бесплатных опций.

Спрошу на всякий случай. Есть у нас в linq2db исью: какие провайдеры надобы доделать https://github.com/linq2db/linq2db/issues/1014#issuecomment-601037110
Если есть желание, думаю за недельку другую вы бы написали DataProvider к linq2db и заодно получили бы плюшки его возможностей.

Я больше нигде не видел. Но в inq2db можно


from t1 in db.Persons
from t2 in db.Assignments.FullJoin(t2 => t2.PresonId == t1.Id)
select new {t1, t2}

from t1 in db.Persons
from t2 in db.Assignments.RightJoin(t2 => t2.PresonId == t1.Id)
select new {t1, t2}

Ну и CROSS APPLY


from t1 in db.Persons
from t2 in db.FromSql<SomeType>($"SomeFunc({t1.Id})")
select new {t1, t2}

EF Core и его LINQ транслация, это встать и застрелится, кто не согласен, могу поспорить, я посматриваю в их багтрекер.


как в LINQ сделать выборку из таблицы по полю, которое было передано в переменной? (если вы может где видели, был бы рад ссылочки).

Детский ворос, вам на StackOwerflov ответили бы сразу. Вся магия в лямбдах и визиторах. Решение громоздкое чтобы тут в ответах писать. Но это только по началу.


На счет LEFT JOIN это действительно магия какая то, тоже постоянно лезу в гугл.

Я вас понимаю, хотя и запомнил ) Так как я один из разработчиков linq2db, то просто придумал новый экстеншин, да и плюю в потолок


from t1 in db.Persons
from t2 in db.Assignments.LeftJoin(t2 => t2.PresonId == t1.Id)
select new {t1, t2}

Для EF это аналогично этому


from t1 in db.Persons
from t2 in db.Assignments.Where(t2 => t2.PresonId == t1.Id).DefaultIfEmpty()
select new {t1, t2}

Или уж совсем по пуритански (то что вы постоянно гуглите)


from t1 in db.Persons
join t2 in db.Assignments on t1.Id equals t2.PresonId into j
from t2 in j.DefaultIfEmpty()
select new {t1, t2}

Другой раз фильтры организовать, как в начале вашей статьи. Сделать что-то универсальное ну практически не возможно. Только копипаст.

Опять же инструмент нужно знать. Без понимания что такое Expression Tree и как оно организовано — будет только копипаста. Я тут PR подготовил для LINQKit, кучу бойлерплейта можно убрать https://github.com/scottksmith95/LINQKit/pull/127


Если бы я был в мире обычного SQL мне бы удалось достичь подобного парой строк кода, но в мире LINQ over EF, только копипаст. Всерьез уже начинаю задумываться о генераторах кода, которые перед билдом будут создавать нужный код!

Опять же непонятно что надо. Все можно сделать! Все!

Возможно я не вижу всей картины, но пока вы рассказывате о том что на linq2db сделать можно. Если там были Table Valued процедуры, они бы в LINQ всторились как родные.

И это тоже есть. AST можно можно модифицировать или передавать по сети. Если нужен функционал, спросить на github.


Хорошая библиотека, но это все-таки LINQ)

Вот не вижу минусов, если только вам не надо полную динамику — не знаю какие будут поля, какие будут таблицы.


Мне же хотелось чего-то совсем близкого к оригинальному SQL.

Так и работает библиотека, только с учетом специфики LINQ. Практически любой SQL я могу выразить с огромной точностью на LINQ без ненужных приседаний с бубнами. Самое главное здесь типобезопасность и возможность компилятора откинуть неправильные запросы еще во время компиляции, также убирается куча бойлерплейта. Под капотом ваши запросы еще и оптимизируются, что дает недюжий выигрыш при композиции запросов.


А так у вас получился аналог JOOQ для .NET, а мне жавистов по этому поводу было жаль ;)

Посмотрите также на linq2db, все те же возможности по удалению, вставке и модификации, merge, только с очень продвинутым LINQ. Жаль что несколько лет назад вы не нагуглили, библиотеке уже лет 8.


Для примера пепепишу ваш запрос


var forInsert = 
   from u in db.GetTable<User>()
   where !db.GetTable<SubCustomer>().Any(sc => sc.UserId == u.UserId)
   select u;

await forInsert.Into(db.GetTable<Customer>())
   .Value(c => c.UserId, u => u.UserId)
   .InsertAsync();

LINQKit, гвоздями к EF не прибит и это его плюс.

Есть еще Microsoft SQL Server. Там есть in-memory вариант. Есть Ignite. Их довольно много.

Меня больше интересует смогут ли они поддержать кластер из 100+ нод без привличения орды девопсов и маинтейнеров.
MemSQL гибридный вариант: есть in-memory для быстрой OLTP нагрузки и Column Store (диск) для скоростной анвлитики. Петабайт в пямять дороговато закидывать )


Но в целом вы должны понимать, что как только вы берете любую шардированную базу данных — про нетривиальные распределенные JOIN-ы можно смело забыть (или забыть про перформанс).

Вот тут вы ошибаетесь, именно по этому я и говорю про MemSQL — нету у них проблем с JOIN https://www.memsql.com/blog/performance-for-memsql-67/ просто посмотрите на милисекунды. Я такие умопомрачительные квери пускал (1500 строк) без тюнинга индексов что глазам не поверил. Кластер как пчелка задействовал все ядра чтобы выдать результат как можно быстрее.

Closed source имеет значение? Как на меня, чем меньше я занимаюсь не делом — тем лучше.


можно и его, и еще многие другие решения платные использовать, если вы готовы платить

Скупой платит дважды а то и больше. Какие еще платные решения можете посоветовать? Я пока только MemSQL эвалюэйтил. Быстрый чертяка, без танцев с бубном.

«А почему под эту задачу не использовать Tarantool?».

А почему не MemSQL ;) Ваш же соотечественник разработал или придумал, неважно.
Не как апликейшен сервер, а как базу в которую влетают миллионы записей в секунду, а скорсть выборки сопоставима с OLAP кубами и это на чистом SQL.

Вот представьте себе миллион записей и эту поделку.

Я тут уже писал. Рано уходить от SQL. Появились NewSQL решения, скоростные что черти. Я лично в восторге от MemSQL, я такого драйва на сотнях миллионах записей еще не видел. Хотя по их блогам там и милиарды за доли секунды процесаются, естественно в разумных рамках и с кучей нод.


https://www.memsql.com/blog/memsql-processing-shatters-trillion-rows-per-second-barrier/


Вам даже не надо TimeSeries базу искать, оно там автоматом! работает на том же SQL.


Я как-то ошибся в джоинах и получилось 80 миллионов на 80 миллионов cartesian exposion ( сколько там нулей будет ). Он это скушал за 3 минуты на двух 16-ти ядерных машинах. А я то думал чего это он начал так медленно это исполнять, а он стойко такую массу операций провел и сгрупировал, что и не укладывается в голове.

CONNECT BY

Пожалуй пока делать не буду. Разве что мне приспичит, а для начала хватит рекусивной CTE, которые поддерживаются.


Помнится у меня были проблемы с fetch/include + paging + order одновременно. И в nhibernate (и с linq и с query over) и в ef. В ef вообще include дико медленный, больше условно 5 штук ужасно тормозит само построение запроса.

Эти детские болезни полечены

SqlServer хинты есть


var query = db.Patients.With(“NOLOCK”);

Но я планирую все это пересмотреть и закончить это раз и навсегда.
Если есть замечания или предложения пожалуйста коментируйте этот issue https://github.com/linq2db/linq2db/issues/2452


Какие там в функции в Oracle… Невозможно за всем уследить.

Черт, не заметил как вы пропустили https://github.com/linq2db/linq2db.EntityFrameworkCore
Те же яйца фичи, только по правильному.

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность