Справочная информация: В течение следующего месяца я буду выступать с тремя докладами, по крайней мере, в том числе LINQ
в контексте C#
. Я хотел бы знать, на какие темы стоит обратить пристальное внимание, основываясь на том, что людям может быть трудно понять, или на что у них может быть ошибочное впечатление. Я не буду конкретно говорить о том, LINQ
чтобы SQL
или в Entity Framework , за исключением примеров того , как запросы могут быть выполнены удаленно с помощью деревьев выражений (и обычно IQueryable
).
Итак, что вы усердно нашли LINQ
? Что вы видели с точки зрения недопонимания? Примерами могут быть любые из следующих, но, пожалуйста, не ограничивайте себя!
- Как
C#
компилятор обрабатывает выражения запроса - Лямбда-выражения
- Деревья выражений
- Методы расширения
- Анонимные типы
IQueryable
- Отложено против немедленного исполнения
- Потоковое и буферизованное выполнение (например, OrderBy откладывается, но буферизируется)
- Неявно типизированные локальные переменные
- Чтение сложных родовых подписей (например, Enumerable.Join )
Ответы:
Задержка исполнения
источник
Я знаю, что концепция отложенного выполнения должна быть уже внедрена в меня, но этот пример действительно помог мне понять это на практике:
Приведенный выше код возвращает следующее:
источник
То есть больше , чем просто ,
LINQ
чтобыSQL
и особенности больше , чем простоSQL
синтаксический анализатор , встроенный в языке.источник
Big O обозначения . LINQ позволяет невероятно легко писать O (n ^ 4) алгоритмов, не осознавая этого, если вы не знаете, что делаете.
источник
Я думаю, что тот факт, что
Lambda
выражение может разрешаться как в дерево выражений, так и в анонимный делегат, позволяет передавать одно и то же декларативноеlambda
выражение как вIEnumerable<T>
методыIQueryable<T>
расширения, так и в методы расширения.источник
Взял меня путь слишком долго , чтобы понять , что многие методы расширения LINQ , такие как
Single()
, иSingleOrDefault()
т.д. имеют перегрузки , которые принимают лямбды.Ты можешь сделать :
и не нужно говорить это - что какой-то плохой учебник привел меня в привычку делать
источник
Count()
и к другим. Знаете ли вы, есть ли разница в производительности в дополнение к очевидному бонусу читабельности кода?В LINQ to SQL я постоянно вижу людей, не понимающих DataContext, как его можно использовать и как его использовать. Слишком много людей не видят DataContext таким, какой он есть, объектом единицы работы, а не постоянным объектом.
Я много раз видел, как люди пытаются записать один DataContext / сеанс / и т. Д. Вместо того, чтобы устанавливать новое время для каждой операции.
Кроме того, существует возможность удаления DataContext до того, как IQueryable будет оценен, но это больше похоже на людей, не понимающих IQueryable, чем DataContext.
Другая концепция, с которой я часто путаюсь - это синтаксис запросов против синтаксиса выражений. Я буду использовать тот, который когда-либо был самым легким на тот момент, часто придерживаясь синтаксиса выражений. Многие люди до сих пор не понимают, что в конце концов они сделают то же самое, Query в конце концов скомпилирован в Expression.
источник
Я думаю, что неправильно понятая часть LINQ заключается в том, что это расширение языка , а не расширение базы данных или конструкция.
LINQ
это намного больше, чемLINQ to SQL
.Теперь, когда большинство из нас использовали
LINQ
коллекции, мы никогда не вернемся!LINQ
является наиболее важной особенностью .NET начиная с Generics в 2.0 и Anonymous Types в 3.0.И теперь, когда у нас есть лямбда, я не могу дождаться параллельного программирования!
источник
Я, конечно, хотел бы знать, нужно ли мне знать, что такое деревья выражений и почему.
источник
Я довольно новичок в LINQ. Вот вещи, на которые я наткнулся в своей первой попытке
источник
Что-то, чего я изначально не осознавал, было то, что синтаксис LINQ не требует
IEnumerable<T>
или неIQueryable<T>
работает, LINQ - это просто сопоставление с образцом.альтернативный текст http://bartdesmet.info/images_wlw/QIsIQueryabletheRightChoiceforMe_13478/image_thumb_3.png
Вот ответ (нет, я не писал этот блог, это сделал Барт Де Смет, и он один из лучших блогеров на LINQ, который я нашел).
источник
У меня все еще есть проблемы с командой "let" (которую я никогда не использовал) и SelectMany (которую я использовал, но я не уверен, что все сделал правильно)
источник
Понимание, когда происходит утечка среди провайдеров Linq. Некоторые вещи работают с объектами, но не с SQL (например, .TakeWhile). Некоторые методы могут быть переведены в SQL (ToUpper), а другие нет. Некоторые методы более эффективны в объектах, где другие более эффективны в SQL (различные методы соединения).
источник
Пара вещей.
источник
Хорошо, из-за спроса, я написал некоторые вещи Expression. Я не на 100% доволен тем, как блоггер и LiveWriter сговорились отформатировать его, но пока это подойдет ...
Во всяком случае, здесь идет ... Я хотел бы получить любую обратную связь, особенно если есть области, где люди хотят больше информации.
Вот оно , хочешь ты ненавидишь ...
источник
Некоторые сообщения об ошибках, особенно из LINQ to SQL, могут быть довольно запутанными. усмешка
Я был укушен отсроченным исполнением пару раз, как и все остальные. Я думаю, что самой запутанной вещью для меня был поставщик запросов SQL Server и то, что вы можете и не можете с ним сделать.
Я все еще поражен тем фактом, что вы не можете использовать Sum () для столбца десятичной дроби / денег, который иногда пуст. Использование DefaultIfEmpty () просто не будет работать. :(
источник
Я думаю, что в LINQ важно упомянуть о том, как вы можете получить проблемы с производительностью. Например, использование счетчика LINQ в качестве условия цикла действительно не очень разумно.
источник
То, что IQueryable принимает как, так
Expression<Func<T1, T2, T3, ...>>
иFunc<T1, T2, T3, ...>
без подсказки о снижении производительности во 2-м случае.Вот пример кода, который демонстрирует, что я имею в виду:
источник
Я не знаю, может ли это быть неправильно понято - но для меня просто неизвестно.
Мне было приятно узнать о DataLoadOptions и о том, как я могу контролировать, какие таблицы объединяются при выполнении определенного запроса.
Смотрите здесь для получения дополнительной информации: MSDN: DataLoadOptions
источник
Я бы сказал, что наиболее недооцененным (или непонятным?) Аспектом LINQ является IQueryable и пользовательские поставщики LINQ .
Я уже некоторое время использую LINQ, и я полностью чувствую себя комфортно в мире IEnumerable, и могу решить большинство проблем с помощью LINQ.
Но когда я начал смотреть и читать о IQueryable, а также о Expressions и пользовательских linq-провайдерах, это заставило меня задуматься. Посмотрите, как работает LINQ to SQL, если вы хотите увидеть довольно сложную логику.
Я с нетерпением жду понимания этого аспекта LINQ ...
источник
Как говорит большинство людей, я думаю, что наиболее неправильно понятая часть предполагает, что LINQ является просто заменой T-SQL. Мой менеджер, который считает себя гуру TSQL, не позволил бы нам использовать LINQ в нашем проекте и даже ненавидит MS за то, что выпустил такую вещь !!!
источник
Что представляет собой var при выполнении запроса?
Является ли это
iQueryable
,iSingleResult
,iMultipleResult
или делает это меняется в зависимости от реализации. Есть некоторые предположения об использовании (как представляется) динамической типизации по сравнению со стандартной статической типизацией в C #.источник
Насколько легко вкладывать петли, я не думаю, что все это понимают.
Например:
источник
group by
все еще заставляет мою голову кружиться.Любая путаница с отложенным выполнением должна быть разрешена путем пошагового выполнения некоторого простого кода на основе LINQ и воспроизведения в окне просмотра.
источник
Скомпилированные запросы
Тот факт, что вы не можете объединить в цепочку,
IQueryable
потому что они являются вызовами методов (хотя это все еще не что иное, как переводимый SQL!) И что практически невозможно обойти это, ошеломляет и создает огромное нарушение DRY. Мне нужны моиIQueryable
специальные, в которых у меня нет скомпилированных запросов (я только скомпилировал запросы для тяжелых сценариев), но в скомпилированных запросах я не могу их использовать, и вместо этого мне нужно снова написать обычный синтаксис запроса. Сейчас я делаю одни и те же подзапросы в 2 местах, нужно помнить, что нужно обновлять, если что-то меняется, и так далее. Кошмар.источник
Я думаю, что ошибочное представление № 1 о LINQ to SQL заключается в том, что вы ДОЛЖНЫ ЗНАТЬ SQL, чтобы эффективно его использовать.
Еще одно неправильное понимание Linq to Sql заключается в том, что вам все равно придется понизить безопасность базы данных до абсурда, чтобы заставить ее работать.
Третий момент заключается в том, что использование Linq to Sql вместе с динамическими классами (то есть определение класса создается во время выполнения) приводит к огромному количеству своевременной компиляции. Который может абсолютно убить производительность.
источник
Ленивая загрузка.
источник
Как уже упоминалось, ленивая загрузка и отложенное выполнение
Чем LINQ to Objects и LINQ to XML (IEnumerable) отличаются от LINQ to SQL (IQueryable)
КАК построить уровень доступа к данным, бизнес-уровень и уровень представления с LINQ на всех уровнях .... и хороший пример.
источник
Как говорит большинство людей, я думаю, что наиболее неправильно понятая часть предполагает, что LINQ является просто заменой T-SQL. Мой менеджер, который считает себя гуру TSQL, не позволил бы нам использовать LINQ в нашем проекте и даже ненавидит MS за то, что выпустил такую вещь !!!
источник
Транзакции (без использования TransactionScope)
источник