Учебники

Entity Framework — Запросы проекции

Одним из наиболее важных понятий для понимания LINQ to Entities является то, что это декларативный язык. Основное внимание уделяется определению того, какая информация вам нужна, а не тому, как ее получить.

  • Это означает, что вы можете тратить больше времени на работу с данными и меньше времени, пытаясь выяснить базовый код, необходимый для выполнения таких задач, как доступ к базе данных.

  • Важно понимать, что декларативные языки на самом деле не удаляют какой-либо элемент управления от разработчика, но это помогает разработчику сосредоточить внимание на том, что важно.

Это означает, что вы можете тратить больше времени на работу с данными и меньше времени, пытаясь выяснить базовый код, необходимый для выполнения таких задач, как доступ к базе данных.

Важно понимать, что декларативные языки на самом деле не удаляют какой-либо элемент управления от разработчика, но это помогает разработчику сосредоточить внимание на том, что важно.

LINQ to Entities Основные ключевые слова

Важно знать основные ключевые слова, используемые для создания запроса LINQ. Есть только несколько ключевых слов, которые нужно запомнить, но вы можете комбинировать их различными способами, чтобы получить конкретные результаты. Следующий список содержит эти основные ключевые слова и предоставляет простое описание каждого из них.

Старший Ключевое слово и описание
1

по возрастанию

Указывает, что операция сортировки выполняется от наименьшего (или наименьшего) элемента диапазона к наивысшему элементу диапазона. Обычно это настройка по умолчанию. Например, при выполнении алфавитной сортировки сортировка будет в диапазоне от A до Z.

2

От

Определяет поле или выражение, используемое для реализации группировки. Поле или выражение определяет ключ, используемый для выполнения задачи группировки.

3

нисходящий

Указывает, что операция сортировки выполняется от самого большого (или самого высокого) элемента диапазона до самого нижнего элемента диапазона. Например, при выполнении алфавитной сортировки сортировка будет в диапазоне от Z до A.

4

Равно

Используется между левым и правым предложениями оператора соединения для соединения первичного источника контекстных данных со вторичным источником контекстных данных. Поле или выражение слева от ключевого слова equals указывает первичный источник данных, а поле или выражение справа от ключевого слова equals указывает вторичный источник данных.

5

От

Определяет источник данных, используемый для получения необходимой информации, и определяет переменную диапазона. Эта переменная имеет то же назначение, что и переменная, используемая для итерации в цикле.

6

группа

Организует вывод в группы, используя указанное вами значение ключа. Используйте несколько групповых предложений для создания нескольких уровней организации вывода. Порядок групповых предложений определяет глубину, на которой появляется конкретное значение ключа в порядке группировки. Вы комбинируете это ключевое слово с by для создания определенного контекста.

7

В

Используется несколькими способами. В этом случае ключевое слово определяет источник контекстной базы данных, используемый для запроса. При работе с объединением ключевое слово in используется для каждого источника контекстной базы данных, используемого для объединения.

8

В

Указывает идентификатор, который можно использовать в качестве ссылки для предложений запроса LINQ, таких как объединение, группирование и выбор.

9

Присоединиться

Создает один источник данных из двух связанных источников данных, например, в основной / подробной настройке. Объединение может указывать внутреннее, групповое или лево-внешнее объединение с внутренним объединением по умолчанию. Вы можете прочитать больше о соединениях на msdn.microsoft.com

10

Позволять

Определяет переменную диапазона, которую можно использовать для хранения результатов подвыражения в выражении запроса. Как правило, переменная диапазона используется для предоставления дополнительного перечисляемого вывода или для повышения эффективности запроса (так что конкретную задачу, такую ​​как поиск строчного значения строки, не нужно выполнять более одного раза).

11

На

Определяет поле или выражение, используемое для реализации объединения. Поле или выражение определяет элемент, общий для обоих контекстных источников данных.

12

Сортировать по

Создает порядок сортировки для запроса. Вы можете добавить восходящее или нисходящее ключевое слово, чтобы контролировать порядок сортировки. Используйте несколько предложений orderby для создания нескольких уровней сортировки. Порядок предложений orderby определяет порядок, в котором обрабатываются выражения сортировки, поэтому использование другого порядка приведет к другому выводу.

13

куда

Определяет, что LINQ должен извлекать из источника данных. Вы используете одно или несколько логических выражений, чтобы определить особенности того, что извлекать. Булевы выражения отделяются друг от друга с помощью && (AND) и || (ИЛИ) операторы.

14

Выбрать

Определяет выходные данные запроса LINQ, указывая, какую информацию необходимо вернуть. Этот оператор определяет тип данных элементов, которые LINQ возвращает в процессе итерации.

по возрастанию

Указывает, что операция сортировки выполняется от наименьшего (или наименьшего) элемента диапазона к наивысшему элементу диапазона. Обычно это настройка по умолчанию. Например, при выполнении алфавитной сортировки сортировка будет в диапазоне от A до Z.

От

Определяет поле или выражение, используемое для реализации группировки. Поле или выражение определяет ключ, используемый для выполнения задачи группировки.

нисходящий

Указывает, что операция сортировки выполняется от самого большого (или самого высокого) элемента диапазона до самого нижнего элемента диапазона. Например, при выполнении алфавитной сортировки сортировка будет в диапазоне от Z до A.

Равно

Используется между левым и правым предложениями оператора соединения для соединения первичного источника контекстных данных со вторичным источником контекстных данных. Поле или выражение слева от ключевого слова equals указывает первичный источник данных, а поле или выражение справа от ключевого слова equals указывает вторичный источник данных.

От

Определяет источник данных, используемый для получения необходимой информации, и определяет переменную диапазона. Эта переменная имеет то же назначение, что и переменная, используемая для итерации в цикле.

группа

Организует вывод в группы, используя указанное вами значение ключа. Используйте несколько групповых предложений для создания нескольких уровней организации вывода. Порядок групповых предложений определяет глубину, на которой появляется конкретное значение ключа в порядке группировки. Вы комбинируете это ключевое слово с by для создания определенного контекста.

В

Используется несколькими способами. В этом случае ключевое слово определяет источник контекстной базы данных, используемый для запроса. При работе с объединением ключевое слово in используется для каждого источника контекстной базы данных, используемого для объединения.

В

Указывает идентификатор, который можно использовать в качестве ссылки для предложений запроса LINQ, таких как объединение, группирование и выбор.

Присоединиться

Создает один источник данных из двух связанных источников данных, например, в основной / подробной настройке. Объединение может указывать внутреннее, групповое или лево-внешнее объединение с внутренним объединением по умолчанию. Вы можете прочитать больше о соединениях на msdn.microsoft.com

Позволять

Определяет переменную диапазона, которую можно использовать для хранения результатов подвыражения в выражении запроса. Как правило, переменная диапазона используется для предоставления дополнительного перечисляемого вывода или для повышения эффективности запроса (так что конкретную задачу, такую ​​как поиск строчного значения строки, не нужно выполнять более одного раза).

На

Определяет поле или выражение, используемое для реализации объединения. Поле или выражение определяет элемент, общий для обоих контекстных источников данных.

Сортировать по

Создает порядок сортировки для запроса. Вы можете добавить восходящее или нисходящее ключевое слово, чтобы контролировать порядок сортировки. Используйте несколько предложений orderby для создания нескольких уровней сортировки. Порядок предложений orderby определяет порядок, в котором обрабатываются выражения сортировки, поэтому использование другого порядка приведет к другому выводу.

куда

Определяет, что LINQ должен извлекать из источника данных. Вы используете одно или несколько логических выражений, чтобы определить особенности того, что извлекать. Булевы выражения отделяются друг от друга с помощью && (AND) и || (ИЛИ) операторы.

Выбрать

Определяет выходные данные запроса LINQ, указывая, какую информацию необходимо вернуть. Этот оператор определяет тип данных элементов, которые LINQ возвращает в процессе итерации.

проекция

Проекционные запросы повышают эффективность вашего приложения, извлекая только определенные поля из вашей базы данных.

  • Если у вас есть данные, вы можете спроектировать или отфильтровать их по мере необходимости, чтобы сформировать данные перед выводом.

  • Основная задача любого выражения LINQ to Entities — получить данные и предоставить их в качестве выходных данных.

Если у вас есть данные, вы можете спроектировать или отфильтровать их по мере необходимости, чтобы сформировать данные перед выводом.

Основная задача любого выражения LINQ to Entities — получить данные и предоставить их в качестве выходных данных.

Раздел «Разработка запросов LINQ to Entities» в этой главе демонстрирует методы выполнения этой основной задачи.

Давайте посмотрим на следующий код, в котором будет получен список студентов.

using (var context = new UniContextEntities()) {

   var studentList = from s in context.Students select s;

   foreach (var student in studentList) {
      string name = student.FirstMidName + " " + student.LastName;
      Console.WriteLine("ID : {0}, Name: {1}", student.ID, name);
   }
}

Один объект

Для извлечения одного объекта ученика вы можете использовать перечисляемые методы First () или FirstOrDefault, которые возвращают первый элемент последовательности. Разница между First и FirstOrDefault заключается в том, что First () сгенерирует исключение, если нет данных результата для предоставленных критериев, тогда как FirstOrDefault () возвращает значение по умолчанию null, если нет данных результата. В приведенном ниже фрагменте кода будет извлечен первый ученик из списка, чье имя Али.

using (var context = new UniContextEntities()) {

   var student = (from s in context.Students where s.FirstMidName 
      == "Ali" select s).FirstOrDefault<Student>();

   string name = student.FirstMidName + " " + student.LastName;
   Console.WriteLine("ID : {0}, Name: {1}", student.ID, name);
}

Вы также можете использовать Single () или SingleOrDefault, чтобы получить один объект ученика, который возвращает один, конкретный элемент последовательности. В следующем примере извлекается один студент, чей ID равен 2.

using (var context = new UniContextEntities()) {

   var student = (from s in context.Students where s.ID 
      == 2 select s).SingleOrDefault<Student>();
   string name = student.FirstMidName + " " + student.LastName;
	
   Console.WriteLine("ID : {0}, Name: {1}", student.ID, name);
   Console.ReadKey();
}

Список объектов

Если вы хотите получить список студентов, чье имя Али — тогда, вы можете использовать перечислимый метод ToList ().

using (var context = new UniContextEntities()) {

   var studentList = (from s in context.Students where s.FirstMidName 
      == "Ali" select s).ToList();

   foreach (var student in studentList) {
      string name = student.FirstMidName + " " + student.LastName;
      Console.WriteLine("ID : {0}, Name: {1}", student.ID, name);
   }

   Console.ReadKey();
}

порядок

Для получения данных / списка в любом конкретном порядке вы можете использовать ключевое слово orderby. В следующем коде фрагмент списка ученика будет получен в порядке возрастания.

using (var context = new UniContextEntities()) {

   var studentList = (from s in context.Students orderby
      s.FirstMidName ascending select s).ToList();

   foreach (var student in studentList) {
      string name = student.FirstMidName + " " + student.LastName;
      Console.WriteLine("ID : {0}, Name: {1}", student.ID, name);
   }

   Console.ReadKey();
}

Стандартный Vs Projection Entity Framework Query

Предположим, у вас есть модель Student, содержащая ID, FirstMidName, LastName и EnrollmentDate. Если вы хотите вернуть список студентов, стандартный запрос вернет все поля. Но если вы хотите получить только список студентов, содержащий поля ID, FirstMidName и LastName. Здесь вы должны использовать проекционный запрос. Ниже приведен простой пример проекционного запроса.

using (var context = new UniContextEntities()) {

   var studentList = from s in context.Students
      orderby s.FirstMidName ascending
      where s.FirstMidName == "Ali"

   select new {s.ID, s.FirstMidName, s.LastName};

   foreach (var student in studentList) {
      string name = student.FirstMidName + " " + student.LastName;
      Console.WriteLine("ID : {0}, Name: {1}", student.ID, name);
   }

   Console.ReadKey();
}

Приведенный выше запрос проекции исключает поле EnrollmentDate. Это сделает ваше приложение намного быстрее.