Каковы основные недоразумения людей, когда они впервые начинают использовать LINQ?
Например, думают ли они, что это одно, когда это действительно что-то еще?
И есть ли некоторые рекомендации, чтобы избежать этих ошибок?
Каковы основные недоразумения людей, когда они впервые начинают использовать LINQ?
Например, думают ли они, что это одно, когда это действительно что-то еще?
И есть ли некоторые рекомендации, чтобы избежать этих ошибок?
Чтобы он использовался для всего.
Неспособность понять различия между (или существованием!):
.First()
.FirstOrDefault()
.Single()
.SingleOrDefault()
Не понимает отложенное выполнение.
Это относится только к LINQ to SQL
Самая большая ошибка, которую люди делают при использовании LINQ, такая же, как когда люди пытаются использовать любую технологию, которая лежит поверх технологии, в которой у них нет хорошего заземления.
Если вы не можете понять правильные/эффективные запросы БД, вы будете лишены LINQ.
Если вы не можете понять основные основы ADO.NET и доступа к данным, вы, вероятно, испортите.
Люди думают, что, используя LINQ, они позволят им двигаться, но это не будет.
Один базовый, который я вижу в LINQ to SQL, не понимает DataContext. Это объект "Единица работы" и должен быть воссоздан для каждой единицы работы.
Признаки, которые приходят на ум, - это
Возможно, одно из неправильных представлений, которое может иметь человек, заключается в том, что способ записи LINQ-запроса, особенно LINQ2SQL, не влияет на производительность. Всегда нужно знать, что происходит в фоновом режиме, если вы намереваетесь написать код с высокой производительностью, иначе вы можете столкнуться с интересными тайм-аутами, OOMexceptions, переполнением стека и такими... =)
Вот один, Запросы LINQ to SQL, содержащие строки, вызывают раздувание кеша процедур SQL Server Люди должны знать об этом
LINQ как язык довольно прямой и не столь неожиданный, особенно если вы знакомы с функциональным программированием.
Концепция Отложенное исполнение, вероятно, является самой большой добычей и одной из лучших функций. Когда вы используете LINQ, который возвращает IQueryable, важно помнить, что вы НЕ выполняете код, который вы только что написали. Только после того, как вы вызовете один из методов, который выдает другой результат, который выполняется запрос.
Кроме того, с точки зрения провайдера LINQ to SQL, самая большая найденная мной информация - это стоимость исполнения. Оказывается, существует значительная стоимость процессора для построения SQL-запросов, которые возникают каждый раз, когда выполняется запрос LINQ, если вы не предварительно компилируете свои запросы с высокой нагрузкой.
Я полностью согласен с Адамом Робинсоном, на самом деле ошибка BIG заключается в том, что люди останавливаются на синтаксисе красоты, не углубляясь в технические факты с точки зрения ударов или архитектурных представлений.
Иногда люди думают об этом как о чем-то, когда это действительно другая вещь.. о том, что важно отметить, что Linq является "технологией" и может быть реализована по-разному, каждый из них может по-разному влиять на производительность и дизайн (например), основной синтаксис остается неизменным, но основные вещи могут измениться.
Собственно, начиная с больших и растущих реализаций, нет полного списка лучших практик, лучшие практики могут начинаться с:
Говоря о себе, важно знать, когда последовательность будет буферизирована или потоковая.
Заполнение буфера большими объемами данных будет потреблять много памяти. Если возможно, операции, такие как реверс, подсчет, упорядочение и т.д., Должны выполняться после уменьшения данных. В соединениях левая последовательность передается потоком, а правая - в буфер. Когда есть значительная разница в размере, поместите меньший справа.
Использование linq2sql для таблиц без первичных ключей (и не определяющих их в дизайнере).
В частности, если они делают обновление, оно ничего не обновляет, и вы не получаете ошибки.
Многие считают, что LINQ - это "магический SQL", который они могут использовать в коде. Это похоже на SQL, но это совсем другое. Понимая, что это разница и то, что она действительно делает, предотвратит много разочарований.
Я думаю, что понимание точки выполнения запроса часто является ошибкой (т.е. верьте ей в точке запроса, а не в момент, когда данные впервые доступны), а также убеждение, что только потому, что оно компилирует его для запуска.
Это относится к Linq to SQL.
Фантастический инструмент для Linq - LinqPad от Joe Albahari, позволил мне быстрее изучить Linq. Если у вас его нет, получите его! И я даже не в комиссию;)
Понимание того, куда вы переходите от Linq2SQL/Entities к Linq2Objects. Понимание того, что есть и что не выполняется в БД, в сравнении с вашим приложением. Зная, когда вы работаете с объектами памяти в сравнении с базовым поставщиком Linq, которые вы используете, а затем зная, как преднамеренно перейти от Linq2SQL к Linq2Objects, когда вам нужно выполнить обработку после запроса, используя функции С#/. NET, не поддерживаемые в вашем провайдера.