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.