IQueryable和IEnumerable之间差异的真实例子?

msh*_*hwf 1 c# linq ienumerable iqueryable

我知道这样IQueryable做的好处是可以在服务器上运行过滤器,而不是在内存中加载所有记录IEnumerable,但是如何在代码中看起来如此,例如,如果我有这样的代码:

var data = context.Books.Where(x => x.Id > 930);
Run Code Online (Sandbox Code Playgroud)

如果我有1000条记录,那么它只会加载70条记录,并迭代它们,我转换data为List:

var list = data.ToList(); //has only 70 records
Run Code Online (Sandbox Code Playgroud)

IEnumerable如果必须首先通过所有记录,那么加载所有记录的情况是什么,IQueryable即获得IEnumerable上述示例的版本:

var eData = context.Books.Where(x => x.Id > 930).ToList();
Run Code Online (Sandbox Code Playgroud)

他们不一样吗?最后一个代码只是组合上面两行代码?

Ser*_*kiy 6

IEnumerable您的代码中没有示例.都

var data = context.Books.Where(x => x.Id >930); // Queryable.Where(Expression)
Run Code Online (Sandbox Code Playgroud)

var eData = context.Books.Where(x => x.Id >930).ToList(); // Queryable.Where(Expression)
Run Code Online (Sandbox Code Playgroud)

使用IQueryable扩展将表达式转换为SQL查询并在服务器端运行它.data和之间唯一的区别eData是你在第二种情况下立即处理查询结果(即枚举它们并放入列表中).如果你想使用IEnumerable:

var eData = context.Books.AsEnumerable().Where(x => x.Id >930); // Enumerable.Where(Lambda)
Run Code Online (Sandbox Code Playgroud)

这里的不同之处在于您可以使用过滤谓词中的任何代码来过滤集合.因为此谓词不会转换为SQL以在服务器端运行.例如,您可以运行自定义方法:

var eData = context.Books.AsEnumerable().Where(x => _someObject.CheckBook(x));
Run Code Online (Sandbox Code Playgroud)

但是所有的书都应该从服务器下载到客户端以便运行IEnumerable查询.