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)
他们不一样吗?最后一个代码只是组合上面两行代码?
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查询.
| 归档时间: |
|
| 查看次数: |
4811 次 |
| 最近记录: |