Entity Framework - 投影查询

LINQ to Entities

理解LINQ to Entities最重要的概念之一是它是一种声明性语言.重点是定义您需要的信息,而不是如何获取信息.

  • 这意味着您可以花更多的时间处理数据,花更少的时间来弄清楚执行任务所需的底层代码,例如访问数据库.

  • 了解声明这一点非常重要语言实际上并没有从开发人员那里删除任何控制,但它有助于开发人员将注意力集中在重要的事情上.

LINQ to Entities Essential关键字

了解用于创建LINQ查询的基本关键字非常重要.只需记住几个关键字,但您可以通过各种方式将它们组合在一起以获得特定结果.以下列表包含这些基本关键字,并提供每个关键字的简单描述.

锶.不.关键字&说明
1

Ascending

指定从范围的最小(或最低)元素到范围的最高元素进行排序操作.这通常是默认设置.例如,在执行字母排序时,排序将在A到Z的范围内.

2

By

指定用于实现分组的字段或表达式.字段或表达式定义用于执行分组任务的键.

3

Descending

指定从范围的最大(或最高)元素到最低元素的排序操作范围.例如,在执行字母排序时,排序将在Z到A的范围内.

4

Equals

在连接语句的左右子句之间用于加入主要用法辅助上下文数据源的上下文数据源. equals关键字左侧的字段或表达式指定主数据源,而equals关键字右侧的字段或表达式指定辅助数据源.

5

From

指定数据源用于获取所需信息并定义范围变量.此变量与用于循环迭代的变量具有相同的目的.

6

Group

使用您指定的键值将输出组织到组中.使用多个组子句创建多个级别的输出组织.组子句的顺序决定了特定键值在分组顺序中的显示深度.您将此关键字与by结合使用以创建特定上下文.

7

In

以多种方式使用.在这种情况下,关键字确定用于查询的上下文数据库源.使用连接时,in关键字用于每个用于连接的上下文数据库源.

8

Into

指定一个标识符,您可以将其用作LINQ查询子句的参考作为加入,分组和选择.

9

Join

从两个相关数据源创建单个数据源,例如在主/详细设置中.连接可以指定内部,组或左外连接,内部连接作为默认连接.您可以在 msdn.microsoft.com 上阅读有关联接的详情./p>

10

Let

定义一个范围变量,可用于将子表达式结果存储在查询表达式中.通常,范围变量用于提供额外的枚举输出或提高查询效率(以便特定任务,例如查找字符串的小写值,不需要执行多次).

11

On

指定用于实现连接的字段或表达式.字段或表达式定义了两个上下文数据源共有的元素.

12

Orderby

创建查询的排序顺序.您可以添加升序或降序关键字来控制排序顺序.使用多个orderby子句创建多个级别的排序. orderby子句的顺序决定了处理排序表达式的顺序,因此使用不同的顺序将导致不同的输出.

13

Where

定义LINQ应从数据中检索的内容资源.您可以使用一个或多个布尔表达式来定义要检索的内容的细节.布尔表达式使用&&(AND)和||相互分隔(或)运营商.

14

Select

通过指定要返回的信息来确定LINQ查询的输出.此语句定义LINQ在迭代过程中返回的元素的数据类型.

投影

投影查询仅通过检索数据库中的特定字段来提高应用程序的效率.

  • 获得数据后,您可能需要根据需要进行投影或过滤,以便在输出之前对数据进行整形.

  • 主要任务任何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.在下面的代码片段中,将检索列表中的第一个学生,其名字是Ali.

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();
}

标准与投影实体框架查询

假设您有一个包含学生模型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字段.这将使您的应用程序更快.