Производительность Linq для сущностей против ESQL

entity-framework entity-sql linq-to-entities

Вопрос

При использовании Entity Framework ESQL работает лучше, чем Linq to Entities?

Я бы предпочел использовать Linq to Entities (в основном из-за строгой проверки типов), но некоторые другие члены моей команды ссылаются на производительность в качестве причины для использования ESQL. Я хотел бы получить полное представление о плюсах / минусах использования любого метода.

Принятый ответ

Наиболее очевидные различия:

Linq to Entities - это строго типизированный код с хорошим синтаксисом понимания запросов. Тот факт, что «от» предшествует «выбору», позволяет IntelliSense помочь вам.

Entity SQL использует традиционные строковые запросы с более знакомым SQL-подобным синтаксисом, где оператор SELECT предшествует FROM. Поскольку eSQL основан на строках, динамические запросы могут быть составлены традиционным способом во время выполнения, используя манипуляции со строками.

Менее очевидное ключевое отличие:

Linq to Entities позволяет вам изменить форму или «спроецировать» результаты вашего запроса на любую нужную вам форму с помощью синтаксиса «выбрать новый {...}». Анонимные типы, впервые появившиеся в C # 3.0, позволили это.

Проецирование невозможно с использованием Entity SQL, поскольку вы всегда должны возвращать ObjectQuery <T>. В некоторых сценариях возможно использовать ObjectQuery <объект>, однако вы должны обойти тот факт, что .Select всегда возвращает ObjectQuery <DbDataRecord>. Смотрите код ниже ...

ObjectQuery<DbDataRecord> query = DynamicQuery(context,
        "Products",
        "it.ProductName = 'Chai'",
        "it.ProductName, it.QuantityPerUnit");

public static ObjectQuery<DbDataRecord> DynamicQuery(MyContext context, string root, string selection, string projection)
{
    ObjectQuery<object> rootQuery = context.CreateQuery<object>(root);
    ObjectQuery<object> filteredQuery = rootQuery.Where(selection);
    ObjectQuery<DbDataRecord> result = filteredQuery.Select(projection);
    return result;
}

Есть и другие, более тонкие различия, подробно описанные одним из членов команды здесь и здесь .


Популярные ответы

ESQL также может генерировать некоторые особенно порочные sql. Мне пришлось отследить проблему с таким запросом, в котором использовались унаследованные классы, и я обнаружил, что мой маленький ESQL из 4 строк переведен в формулировку SQL монстра из 100000 символов.

Сделал то же самое с Linq, и скомпилированный код стал намного более управляемым, скажем, 20 строк SQL.

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

ОБЪЯВЛЕНИЕ



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему