Language Integrated Query (LINQ) — это конвейер выполнения запросов, применяемый в управляемой среде. NET Framework. В сущности, LINQ представляет собой разработанное специалистами Microsoft средство объектно-реляционной проекции между бизнес-объектами и базовыми источниками данных, которое обеспечивает упрощенную среду для обращения к реляционным данным объектно-ориентированным способом.
Отслеживание объектов. Отключите свойство ObjectTrackingEnabled, если оно не потребуется. Если вы планируете только считывать данные через контекст данных и не собираетесь редактировать их, отключите свойство ObjectTrackingEnabled; таким образом вы деактивируете ненужную функцию управления идентичностью объектов, что приведет к повышению производительности приложения.
Проиллюстрируем сказанное на примере:
using (TestDataContext dataContext = new TestDataContext ()) { dataContext.ObjectTrackingEnabled = false; }
Контексты данных. Если в приложении используется несколько несоединенных баз данных, попробуйте применить несколько контекстов данных с целью снижения расходов на управление идентичностью и отслеживание объектов. Присоединяйте к контексту данных только те объекты, которые были изменены.
Откомпилированные запросы. Для повышения производительности приложения можно задействовать откомпилированные запросы. Но не забывайте, что при использовании того или иного откомпилированного запроса в первый раз вам нужно быть готовым к высоким затратам. Поэтому проследите за тем, чтобы откомпилированные запросы применялись лишь в тех случаях, когда они действительно нужны, то есть когда эти запросы будут применяться многократно.
Оптимистический параллелизм. Управление параллелизмом — это механизм, позволяющий выявлять и разрешать конфликты, возникающие вследствие параллельных запросов к одному и тому же ресурсу в тот или иной момент времени. Параллелизм в ADO.NET бывает двух типов: оптимистический и пессимистический. По умолчанию LINQ следует модели оптимистического параллелизма. Без особой надобности механизм оптимистического параллелизма лучше не применять. Чтобы отключить проверку на наличие оптимистического параллелизма, вы можете использовать UpdateCheck.Never в сопоставлении на уровне атрибутов для классов объектов, как показано ниже:
[Column (Storage="_FirstName", DbType="NText", UpdateCheck=UpdateCheck.Never)] public string FirstName { get { return this._FirstName; } set { if ((this.FirstName !=value)) { this.OnFirstNameChanging (value); this.SendPropertyChanging (); this._FirstName =value; this.SendPropertyChanged ("FirstName"); this.OnFirstNameChanged (); } } }
Считывание выбранных данных. При необходимости связывания разбитых на страницы данных с органами управления данными используйте методы Take и Skip.
Пример:
private List GetStudentRecordss (int index, intsize) { using (TestDataContextdataContext = new TestDataContext ()) { returndataContext.Students .Take (size) .Skip (index * size) .ToList (); } }
Кроме того, необходимо соответствующим образом отфильтровать данные с помощью DataLoadOptions.AssociateWith, так чтобы были возвращены только нужные данные. Вот пример, показывающий, каким образом можно использовать DataLoadOptions.AssociateWith для извлечения выбранных данных с помощью LINQ:
using (TestDataContext dataContext = new TestDataContext ()) { DataLoadOptionsdataLoadOptions = new DataLoadOptions (); dataLoadOptions.AssociateWith (emp=>emp.Department.Where (dept => dept.DeptCode == 1)); dataContext.LoadOptions =dataLoadOptions; }
Анализ запросов. Воспользовавшись свойством Log контекста данных, как показано в публикуемом ниже фрагменте кода:
using (TestDataContext dataContext = new TestDataContext ()) { #if DEBUG dataContext.Log =Console.Out; #endif }
вы также можете проанализировать инструкции SQL и отслеживать их в Visual Studio IDE.