#c# #.net
Вопрос:
Мы знаем, что запрос LINQ to SQL не выполняется в вашей программе на C#. Вместо этого он переводится в SQL, отправляется по проводу и выполняется на сервере базы данных. Допустим, у нас есть следующий запрос LINQ
var query = from c in db.Customers where c.City == "Nantes" select new { c.City, c.CompanyName };
Сначала он преобразуется в следующую инструкцию SQL, а затем выполняется на сервере базы данных:
SELECT [t0].[City], [t0].[CompanyName] FROM [dbo].[Customers] AS [t0] WHERE [t0].[City] = @p0
Мой вопрос в том, почему бы не позволить компилятору напрямую скомпилировать запрос LINQ в SQL, зачем сначала преобразовывать запрос LINQ в дерево выражений, а затем «компилировать» это дерево выражений в SQL, что добавляет дополнительный слой?
Я понимаю, что существуют другие технологии баз данных, такие как отсутствие sql и т. Д., Поэтому мы не можем позволить разработчику C# обрабатывать все различные технологии, поэтому означает ли это, что это поставщик баз данных, такой как Microsoft.EntityFrameworkCore.SQLServer проанализирует дерево выражений и превратит его в SQL, что означает, что именно поставщик базы данных обрабатывает дерево выражений?
Комментарии:
1. Запросы LINQ состоят из выражений, они не компилируются/не переводятся в выражения.
where c.City == "Nantes"
или эквивалентные.Where(c=gt; c.City == "Nantes")
выражения использования.2. @PanagiotisKanavos спасибо вам за ваш ответ. То же самое делает поставщик баз данных, такой как Microsoft. EntityFrameworkCore.SQLServer переводит выражения в инструкцию SQL?
Ответ №1:
Это правильно. Дерево выражений-это своего рода AST (абстрактное синтаксическое дерево), которое должно обрабатываться «поставщиком», таким как SQL Server, PostgreSQL, NoSQL или даже XML.
Комментарии:
1. спасибо за ваш ответ, когда вы говорите «обработано «поставщиком» как SQL Server», вы имеете в виду Microsoft. EntityFrameworkCore.SQLServer, установленный на стороне клиента или SQL Server на стороне сервера?
2. Да, я имел в виду Microsoft. EntityFrameworkCore.SQLServer или Microsoft. EntityFrameworkCore.NpgSQL, MongoDriver и т. Д