анализирует ли поставщик базы данных и «компилирует» дерево выражений?

#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 и т. Д