使用LINQ理解Var和IEnumerable

前面的文章中,我解释了IEnumerable和IQuerableIEnumerable和IList之间的区别。 在本文中,我想使用LINQ分享我对Var和IEnumerable的理解。 IEnumerable是一个只能在集合上向前移动的接口,它不能向后移动和在Item之间移动。 Var用于声明隐式类型的局部变量,它指示编译器在编译时找出变量的类型。一个var变量必须在声明时就初始化。 两者都有自己的重要性来查询数据和数据操作。

 

由于Var是匿名类型,所以尽管你不知道它的输出类型也可以使用它。 在LINQ中,假设您正在Join查询两张表,并从两张表中检索数据,则结果将为匿名类型。

1  var q =(from e in tblEmployee 
2  join d in tblDept on e.DeptID equals d.DeptID 
3  select new 
4  { 
5    e.EmpID,
6    e.FirstName,
7    d.DeptName
8  }); 

在上面的查询中,由于结果来自两张表,因此使用 var 类型。

 

var q =(from e in tblEmployee where e.City=="Delhi" 
select new { 
    e.EmpID,
    FullName=e.FirstName+" "+e.LastName, 
    e.Salary 
}); 

在上面的查询中,结果只来自单个表,但是我们将员工的名字和姓氏组合为新的类型为FullName,这是匿名类型,因此使用Var类型。 因此,当您想要快速制作“自定义”类型时,请使用Var类型。
更多时候,var变量就像IQueryable一样,因为它在服务器端执行带所有过滤器的SELECT查询。 请参考下面的例子来解释。

 

IEnumerable示例:

1  MyDataContext dc = new MyDataContext ();
2 IEnumerable<Employee> list = dc.Employees.Where(p => p.Name.StartsWith("S"));
3 list = list.Take<Employee>(10); 

以上查询将生成如下的SQL语句:

1 SELECT [t0].[EmpID], [t0].[EmpName], [t0].[Salary] 
2 FROM [Employee] AS [t0]
3 WHERE [t0].[EmpName] LIKE @p0

注意:在这个查询语句中缺少 [ TOP 10 ] ,因为IEnumerable是在客户端过滤数据的。

 

Var 示例:

 MyDataContext dc = new MyDataContext ();
var list = dc.Employees.Where(p => p.Name.StartsWith("S"));
list = list.Take<Employee>(10); 

以上查询将生成如下的SQL语句:

SELECT TOP 10 [t0].[EmpID], [t0].[EmpName], [t0].[Salary] FROM [Employee] AS [t0] WHERE [t0].[EmpName] LIKE @p0

注意:在这个查询语句中是带有 [ TOP 10 ]的 ,因为这里的 var  的类型是 IQueryable 。它将在SQLSERVER端执行带所有过滤器的SELECT。

 

IEnumerable与LINQ

IEnumerable是一个只向前的集合,当我们已经知道查询结果的类型时很有用。 在下面的查询中,结果将是可以映射(员工表)的员工列表。

1 IEnumerable<tblEmployee> lst =
2 (
3     from e in tblEmployee 
4     where e.City=="Delhi" 
5     select e
6 ); 

 

总结:

  1. 在LINQ查询中,当您想要“自定义”类型时,请使用Var类型。

  2. 在LINQ查询中,当您已经知道查询结果的类型时,请使用IEnumerable。

  3. 在LINQ查询中,Var也适用于远程集合(数据库或其他服务),因为它的行为类似于IQuerable。

  4. IEnumerable适用于内存中的集合。

posted @ 2017-09-01 19:04  X-Cracker  阅读(1128)  评论(0编辑  收藏  举报