使用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适用于内存中的集合。

转载于:https://www.cnblogs.com/WinHEC/articles/understanding-var-and-ienumerable-with-linq.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值