IQueryable 和 IEnumable

版权声明:本文为博主原创文章,遵循​​ CC 4.0 BY-SA ​​版权协议,转载请附上原文出处链接和本声明。

public class student { 
public string Name { get; set; }
public int Id { get; set; } }

var st = new List<student>();

var result= st.Where(t=>t.Id>2);


​这里的result 是IEnumable<student>。 ​

​执行这个where 不会耗时间,因为这里不执行实际的操作,只是把这个 lamda表达式封装了一层,封装为一个委托,待以后foraech 的时候使用。​

​这个无法拼接。如果不改变上面的代码,不能在这个之后,把 st.Where(t=>t.name.Length>2); 也拼进去。​

​只能在foreach 的时候处理了。​

​-----------------------------------------------------------------------------------------------------------------------​

using (var context = new MonitorDBContext("Server=DESKTOP-H32IVT0\\SQLEXPRESS;uid=sa;pwd=---;Database=MonitorDB;")) {
context.Users.Add(new User { Name="老王",Email="qqqq@qq.com"});
context.SaveChanges();
var users = context.Users.Where(t=>t.Id>2);
Console.WriteLine("{0,6} {1,5} {2,20}", "ID", "Name", "Email");
foreach (var user in users){
Console.WriteLine("{0,6} {1,5} {2,20}", user.Id, user.Name, user.Email);
}
Console.ReadKey();

}


上面加红的代码 这个users 是 IQueryable<user> 类型的。这句的执行也是不耗时间的。

这只是把这个lamda表达式封装了一层,封装为一个Expression.而不是一个委托。

这个Expression可以拼装,在这句后,接着写 where , orderby等。

IQueryable<T>类型,继承了IEnumable<T>,就是也可以foreach.他有四个属性,其中一个是IEnumable<T>的。

另外的是IQueryable 的

 public interface IQueryable : IEnumerable

    {

        Expression Expression { get; }

        Type ElementType { get; }

        IQueryProvider Provider { get; }

    }

可以调试状态看这几个到底什么值。

IQueryable 和 IEnumable_封装