2008-09-02 2 views
18

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

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

ответ

17

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

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

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

Менее очевидным является ключевым отличием:

Linq к 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; 
} 

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

1

Больше кода, который вы можете покрыть, с проверкой времени компиляции для меня - это то, что я поставил бы более высокую премию, чем производительность. Сказав, что на этом этапе я, вероятно, склоняюсь к ESQL не только из-за производительности, но также (в настоящее время) намного более гибким в том, что он может сделать. Нет ничего хуже, чем использование стека технологий, у которого нет функции, которая вам действительно нужна.

Сущность framework не поддерживает такие вещи, как пользовательские свойства, пользовательские запросы (когда вам нужно реально настроить производительность) и не работает так же, как linq-to-sql (т.е. есть функции, которые просто не делают работать в рамках сущности).

Мое личное впечатление от Entity Framework заключается в том, что существует большой потенциал, но это, вероятно, немного «жестко» в его реализации для использования в производственной среде в ее текущем состоянии.

2

Entity-SQL (eSQL) позволяет вам делать такие вещи, как динамические запросы, легче, чем LINQ to Entities. Однако, если у вас нет сценария, который требует eSQL, я бы не решался полагаться на него по LINQ, потому что его будет намного сложнее поддерживать (например, больше не проверять время компиляции и т. Д.).

Я считаю, что LINQ позволяет предварительно скомпоновать ваши запросы, что может дать вам лучшую производительность. Rico Mariani blogged about LINQ performance некоторое время назад и обсуждает скомпилированные запросы.

3

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

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

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

AD

2

хорошего график сравнение показывает производительность здесь: Entity Framework Performance Explored не так много различий замечены между ESQL и лицами , но в целом различия существенного в использовании Сущности над прямыми запросами

Entity Framework использует два слой отображения объекта (по сравнению с одной слой в LINQ to SQL), а дополнительное сопоставление имеет затраты на производительность. По крайней мере, в версии EF 1 разработчики приложений должны выбрать Entity Framework только в том случае, если возможности моделирования и ORM-сопоставления могут оправдать эту стоимость.

0

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