使用LINQ理解Var和IEnumerable
在前面的文章中,我解释了IEnumerable和IQuerable,IEnumerable和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 );
总结:
-
在LINQ查询中,当您想要“自定义”类型时,请使用Var类型。
-
在LINQ查询中,当您已经知道查询结果的类型时,请使用IEnumerable。
-
在LINQ查询中,Var也适用于远程集合(数据库或其他服务),因为它的行为类似于IQuerable。
-
IEnumerable适用于内存中的集合。