Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
.Select (x => new DocumentDto {...})
Процедуры могут помочь когда возможностей Linq-провайдеров недостаточно, но заменить Linq, не потеряв темп разработки и\или быстродействие, почти нереально.
Как у LINQ обстаят дела с:
Атомарными операциями
Транзакциями
Ну а про масштабируемость — это вообще отдельная песня. Кейсы:
Отсутсвие тестового стенда
Несколько комманд работающих с одной БД
В чем отличие одного от другого для вас?
С транзакциями в EF все нормально.
Какое отношение эти два кейса имеют к масштабируемости вообще и к EF в частности?
По мне, с клиента не хорошо открывать транзакцию.
DBA не ругаются в такой неконтролируемый пул запросов?
Эта позиция неверна, потому что только «клиент» (на самом деле — бизнес-слой) знает реальный границы атомарности идущей операции.
А что касается обоих ваших примеров — просто представьте, что вокруг БД есть гарантированный уровень абстракции в виде DAL, и поймите, что все ваши методики к нему равноприменимы.
А если клиентов несколько? И много языков программирования? И всё это это должно выполнять целостость операции?
Я правильно понимаю, что для этого нужен отдельный сервер BL, который будет рулить запросами (SOA)?
Но это прилично поднимает стоимость разработки…
Во всех распространенных провайдерах есть свой компилятор запроса, который один раз преобразует Linq в SQL и отдает тебе фукнцию, через которую можно результаты получить. Но обычно это доли, которые могут быть важны только при очень большой нагрузке (такой, которую менее 1% увидят в жизни увидят).
Речь идет о том, что SQL сервер строит план для первого исполнения исходя из текущих параметров
И тут нужен with recompile. А в EFW такого просто нет. И тут уже без хранимок не представляю даже — как выкрутиться. Реальный случай.
Они органично вписываются и дополняют EFW в нужных местах.
Или, если вам необходимо использовать хинты SQL или другие низко-уровневые вещи.
Description nvarchar(max). По умолчанию оно попадает на отдельные страницы данных в SQL Server, поэтому если не укажешь в проекции то вытягиваться не будет.Вообще пытаться оптимизировать структуру базы до того как оптимизированы запросы — контрпродуктивно
Лечить table scan добавлением памяти и процессоров — это пять— к сожалению, подобная практика мне встречалась и продолжает встречаться даже в очень серьезных системах — DBA пытаются изо всех сил исправить косяки проектирования, чем только могут — ставя 8-ядерные выделенные сервера с 64 Гб памяти только потому, что в тестовой конфигурации в ключевых таблицах было по 10^5 строк, а в продакшене — 10^7, а под лихой запрос разработчика, странслированный EF, не может быть использован ни один существующий или какой-нибудь новый индекс — в частности, и из-за корявости предикатов.
Аналогии по умолчанию лживы— ваши измеряемые величины в разработке ПО — это метрики эффективности самого процесса разработки. А я говорю о метриках эффективности работы самой создаваемой системы, то есть результата этого процесса. И они больше зависят от качества проектирования, чем от качества ведения процесса разработки (если, конечно, интенсивность багов остается в разумных пределах).
есть другой, более эффективный путь построения систем, без использования EF,
DbFunctions.AddDays, а в Linq2SQL я использовал DateTime.AddDays в запросах. В точки зрения SQL — одинаково, поэтому нет смысла писать больше.WHERE cast(CreatedOn as Date) = cast(GETDATE() as Date)
Естественно ни одни индекс не сможет оптимизировать такую выборку и будет полный обход таблицы.
//в DataContext или каком-то еще DAL:
public IQueryable<Document> GetDocumentsToday()
//в классе DocumentDto
public static DocumentDto[] QueryFrom(IQueryable<Document> query)
public static IQueryable<Document> AddedToday(this IQueryable<Document> query). Как еще вариант — сделать public Expression<Func<Document, bool>> AddedTodayFilter, или Expression<Func<Document, bool>> GetAddedTodayFilter().
3 самые плохие вещи, которые можно сделать с помощью Linq to Database