Если это плохо для использования встроенного SQL, как делает использование, LINQ для выполнения запросов отличаются на практике?

Нет действительно никакого ненеоднозначного, объективного определения для них. Вот то, как я определил бы их:

Императив - фокус включен, что ступает, компьютер должен взять, а не что компьютер будет делать (напр. C, C++, Java).

Описание - фокус включен, что должен сделать компьютер, а не как это должно сделать это (напр. SQL).

Функциональный - подмножество декларативных языков, которое имеет тяжелое внимание на рекурсию

13
задан Leon Bambrick 7 July 2011 в 03:39
поделиться

9 ответов

Игнорирование всех видов использования LINQ, не связанных с SQL, и рассмотрение только LINQ-to-SQL.

Запросы LINQ - это объекты, которые сохраняют определение запроса и эквивалент SQL создается только в тот момент, когда запрос фактически повторяется. Это позволяет правильно разделить компоненты и разрешить обработку в стиле конвейера , когда запросы возвращаются нижними уровнями (например, репозиториями) и преобразуются более высокими компонентами в стеке. Запрос может включать новые фильтры, объединения и другие «артефакты» от каждого компонента в конвейере обработки до тех пор, пока он не достигнет окончательной формы, которая в конечном итоге будет повторена. Эта манипуляция невозможна на практике при использовании обычного текстового SQL.

Еще одно преимущество LINQ состоит в том, что его синтаксис легче понять разработчикам, не связанным с базами данных. Опыт синтаксиса SQL найти на удивление сложно. Немногие разработчики готовы тратить время на изучение более тонких моментов SQL, помимо SELECT * FROM ... WHERE ... . Синтаксис linq ближе к повседневной среде .Net и использует существующий набор навыков на этом уровне (например, лямбда-выражения), а не заставляет разработчика изучать правильный SQL для целевой серверной части (T-SQL, PL-SQL так далее). Учитывая, что выражение linq выражает желаемый результат в значительной степени прямо в реляционной алгебре, поставщикам гораздо проще создать соответствующий SQL (или даже создать прямой план выполнения!). Сравните это с невыполнимой задачей, с которой «универсальным» драйверам базы данных пришлось столкнуться с текстом SQL. Кто-нибудь помнит синтаксис экранирования ODBC?

Немногие разработчики готовы тратить время на изучение более тонких моментов SQL, помимо SELECT * FROM ... WHERE ... . Синтаксис linq ближе к повседневной среде .Net и использует существующий набор навыков на этом уровне (например, лямбда-выражения), а не заставляет разработчика изучать правильный SQL для целевой серверной части (T-SQL, PL-SQL так далее). Учитывая, что выражение linq выражает желаемый результат в значительной степени прямо в реляционной алгебре, поставщикам гораздо проще создать соответствующий SQL (или даже создать прямой план выполнения!). Сравните это с невыполнимой задачей, с которой «универсальным» драйверам базы данных пришлось столкнуться с текстом SQL. Помните синтаксис escape-последовательности ODBC, кто-нибудь?

Немногие разработчики готовы тратить время на изучение более тонких моментов SQL, помимо SELECT * FROM ... WHERE ... . Синтаксис linq ближе к повседневной среде .Net и использует существующий набор навыков на этом уровне (например, лямбда-выражения), а не заставляет разработчика изучать правильный SQL для целевой серверной части (T-SQL, PL-SQL так далее). Учитывая, что выражение linq выражает желаемый результат в значительной степени прямо в реляционной алгебре, поставщикам гораздо проще создать соответствующий SQL (или даже создать прямой план выполнения!). Сравните это с невыполнимой задачей, с которой «универсальным» драйверам базы данных пришлось столкнуться с текстом SQL. Помните синтаксис escape-последовательности ODBC, кто-нибудь?

ГДЕ ... . Синтаксис linq ближе к повседневной среде .Net и использует существующий набор навыков на этом уровне (например, лямбда-выражения), а не заставляет разработчика изучать правильный SQL для целевой серверной части (T-SQL, PL-SQL так далее). Учитывая, что выражение linq выражает желаемый результат в значительной степени прямо в реляционной алгебре, поставщикам гораздо проще создать соответствующий SQL (или даже создать прямой план выполнения!). Сравните это с невыполнимой задачей, с которой «универсальным» драйверам базы данных пришлось столкнуться с текстом SQL. Кто-нибудь помнит синтаксис экранирования ODBC?

ГДЕ ... . Синтаксис linq ближе к повседневной среде .Net и использует существующий набор навыков на этом уровне (например, лямбда-выражения), а не заставляет разработчика изучать правильный SQL для целевой серверной части (T-SQL, PL-SQL так далее). Учитывая, что выражение linq выражает желаемый результат в значительной степени прямо в реляционной алгебре, поставщикам гораздо проще создать соответствующий SQL (или даже создать прямой план выполнения!). Сравните это с невыполнимой задачей, с которой «универсальным» драйверам базы данных пришлось столкнуться с текстом SQL. Помните синтаксис escape-последовательности ODBC, кто-нибудь?

лямбда-выражения) вместо того, чтобы заставлять разработчика изучать правильный SQL для целевой серверной части (T-SQL, PL-SQL и т. д.). Учитывая, что выражение linq выражает желаемый результат в значительной степени прямо в реляционной алгебре, поставщикам гораздо проще создать соответствующий SQL (или даже создать прямой план выполнения!). Сравните это с невыполнимой задачей, с которой «универсальным» драйверам базы данных пришлось столкнуться с текстом SQL. Помните синтаксис escape-последовательности ODBC, кто-нибудь?

лямбда-выражения), а не заставлять разработчика изучать правильный SQL для целевой серверной части (T-SQL, PL-SQL и т. д.). Учитывая, что выражение linq выражает желаемый результат в значительной степени прямо в реляционной алгебре, поставщикам гораздо проще создать соответствующий SQL (или даже создать прямой план выполнения!). Сравните это с невыполнимой задачей, с которой «универсальным» драйверам базы данных пришлось столкнуться с текстом SQL. Помните синтаксис escape-последовательности ODBC, кто-нибудь?

драйверы баз данных должны были тщательно столкнуться с текстом SQL. Кто-нибудь помнит синтаксис экранирования ODBC?

драйверы баз данных должны были тщательно столкнуться с текстом SQL. Помните синтаксис escape-последовательности ODBC, кто-нибудь?

7
ответ дан 2 December 2019 в 00:31
поделиться

Вы правы: «Встраивать инструкцию SQL в ваш код - неплохо». Это ужасно.

В противном случае ваше приложение становится сильно связанным, хрупким и трудным в поддержке. По крайней мере, если у вас есть все в процессах, когда вы что-то изменяете, вы можете выполнять поиск по зависимостям.

Сохраненные процессы, я чувствую, что действительно нужно уйти и для тех процессов, которые обрабатывают бизнес-логику.

Причина в том, что бизнес-логика принадлежит бизнес-уровню, а не уровню данных.

Конечно, если сгенерированный Linq to SQL оказывается чем-то беспорядочным и медленным, вы должны использовать процедуру.

] Одним из больших преимуществ Linq To SQL является то, что вы можете объединять фильтры в цепочку - вы просто добавляете предложение where динамически через вашу логику по мере необходимости. Ты не

5
ответ дан 2 December 2019 в 00:31
поделиться

Встраивание оператора SQL в ваш код - это неплохо. Все зависит от того, на каком уровне вашего приложения вы их пишете.

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

1
ответ дан 2 December 2019 в 00:31
поделиться

Два преимущества «Linq To Sql» по сравнению с (наиболее распространенный худший случай) «встроенный SQL» .

Параметры обрабатываются как параметры, а не просто как конкатенированный текст - это решает проблемы внедрения SQL.

Отдельный уровень модели позволяет проверять во время компиляции, что сгенерированный sql соответствует схеме. (В худшем случае встроенного sql вы не сможете узнать во время компиляции, ссылаетесь ли вы, например, на удаленный столбец)

1
ответ дан 2 December 2019 в 00:31
поделиться

С одной стороны, операторы LINQ параметризованы - встроенные запросы не обязательно так. С другой стороны, LINQ в основном создает уровень ORM, позволяющий обрабатывать объекты базы данных по существу как объекты в коде, обеспечивая проверку времени компиляции. С другой стороны, встроенный запрос - это кусок текста, который не сломается во время компиляции ...

0
ответ дан 2 December 2019 в 00:31
поделиться

Из моего небольшого понимания, используете ли вы LINQ-to-SQL или любой другой ORM или свой собственный код, который обертывает вызовы SQL, он в основном дает вам абстракцию, благодаря которой вам не нужно беспокоиться о SQL.

Кроме того, если я прав - LINQ to SQL поддерживает только SQL Server.
Я думаю, это позволяет вам создавать свои критерии аналогично SQL, используя синтаксис LINQ.

Лично я не знаю, зачем кому-то использовать LINQ to SQL.
Может ли эксперт помочь мне понять необходимость этого?

0
ответ дан 2 December 2019 в 00:31
поделиться

Глядя на другие ответы, возможно, я неправильно понял вопрос ... но я говорю о нормальном LINQ для коллекций в C #, а не о LINQ-to-SQL:

Когда вы встраиваете Операторы SQL в вашем коде (вместо того, чтобы делать их переменными или иным образом параметризировать свой SQL), вы значительно усложняете себе задачу, если хотите поддерживать другую базу данных в будущем. Каким бы старым и стандартизированным ни был SQL, между поставщиками все еще существует много несовместимостей.

С LINQ переносимость больше не является проблемой - ваш код написан на C #, а LINQ - это C #.

0
ответ дан 2 December 2019 в 00:31
поделиться

В какой-то строке кода кто-то когда-нибудь решит, уместно ли вводить SQL. Но вместо этого вы будете использовать LINQ.

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

LINQ - это просто абстракция для манипуляция данными. Это ярлык для наборов фильтров. Так же, как базы данных понимают SQL, в среде .NET есть язык для взаимодействия с данными.

В чем разница между LINQ и операторами if внутри цикла, с данными, которые пришли из файла или сетевого сокета? Нет, это просто синтаксис. Если вы SELECT * FROM table фильтруете каждую строку по функции, какая разница от выполнения , где c.SomeProperty с LINQ? Только синтаксис.

Конечно, LINQ знает и делает больше, чем просто возвращает строки из базы данных. Он позволяет вам создавать экземпляры объектов из коллекции, но то же самое делает = new ClassName (column1, colum2) из результатов оператора SQL.

Короче говоря, если где-то написать встроенный SQL в вашем коде - нет-нет , поэтому он должен писать LINQ.

Но это варьируется от проекта к проекту. Базы данных в основном понимают SQL, поэтому, по крайней мере, где-то в вашем коде, библиотеке или среде есть встроенные SQL.

x
с LINQ? Только синтаксис.

Конечно, LINQ знает и делает больше, чем просто возвращает строки из базы данных. Он позволяет вам создавать экземпляры объектов из коллекции, но то же самое делает = new ClassName (column1, colum2) из результатов SQL-оператора.

Короче говоря, если где-то написать встроенный SQL в вашем коде - нет-нет , поэтому он должен писать LINQ.

Но это варьируется от проекта к проекту. Базы данных в основном понимают SQL, поэтому, по крайней мере, где-то в вашем коде, библиотеке или среде есть встроенные SQL.

x с LINQ? Только синтаксис.

Конечно, LINQ знает и делает больше, чем просто возвращает строки из базы данных. Он позволяет вам создавать экземпляры объектов из коллекции, но то же самое делает = new ClassName (column1, colum2) из результатов SQL-оператора.

Короче говоря, если где-то написать встроенный SQL в вашем коде - нет-нет , поэтому он должен писать LINQ.

Но это варьируется от проекта к проекту. Базы данных в основном понимают SQL, поэтому, по крайней мере, где-то в вашем коде, библиотеке или среде есть встроенные SQL.

поэтому он должен писать LINQ.

Но это варьируется от проекта к проекту. Базы данных в основном понимают SQL, поэтому, по крайней мере, где-то в вашем коде, библиотеке или среде есть встроенные SQL.

поэтому он должен писать LINQ.

Но это варьируется от проекта к проекту. Базы данных в основном понимают SQL, поэтому, по крайней мере, где-то в вашем коде, библиотеке или среде есть встроенные SQL.

0
ответ дан 2 December 2019 в 00:31
поделиться

Много работали со встроенным SQL, реальная опасность заключается в том, что это технология генерации кода. Вы пишете код C (или любой другой язык), а затем переключаетесь на SQL, а затем снова обратно на C. Позже, перед компиляцией, препроцессор переписывает код, чтобы он был полностью C. В результате могут генерироваться очень запутанные сообщения об ошибках. Вы вынуждены изучать API для взаимодействия с базой данных, от которой вас должен был освободить встроенный SQL. Наконец, вы рискуете встроить бизнес-правила в свои запросы, запутывая бизнес-уровень и уровень данных. Linq позволяет избежать некоторых из этих проблем. Во-первых, Linq - это часть языка. Конструкции работают более или менее так, как ожидает программист. Используется некоторый синтаксис типа SQL, но в основном синтаксис ориентирован на основной язык (например, C #). Проверки компиляции выполняются на самом написанном вами коде. Поэтому нет необходимости переводить ошибки в синтаксис перед предварительной обработкой. Результатами запроса являются объекты и коллекции, как и следовало ожидать. Однако существует опасность смешивания бизнес-логики на уровне данных. Кроме того, у Linq есть собственные проблемы с сообщениями об ошибках, когда соответствующее поле часто не включается. Тем не менее, это хороший компромисс между объектным миром и миром отношений.

0
ответ дан 2 December 2019 в 00:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: