• EF下怎么理解IEnumerable/ICollection/IQueryable?


    IEnumerable

    • 最基本的列表容器,连列表项Count都不能获取
    • 允许遍历, 但不允许添加、删除、更新列表项
    • 支持使用where linq查询
    • 适合填充Grid展示及筛选

    ICollection

    • IEnumerable 的扩展,增加了添加、删除、更新等操作
    • 可以获取列表项Count, 获得Count的算法复杂度为O(1)
    • 支持遍历、where等所有linq查询
    • 适合做类的导航属性,一般在一对多的计算中,可以通过它进行更新,删除等

    IList

    • ICollection 的扩展,支持IEnumerable 和ICollection的所有操作
    • 支持更多列表项操作,如列表中插入和删除元素
    • 适合在方法体中做一些中间操作

    IQueryable

    • 支持LINQ to SQL表达式查询,作用于数据库级别
    • 示例:var wantedP = from p in Parts where p.CanOperate==true select p;
    • 适合对Grid的各种查询排序等

    一般返回数据集合是用IEnumerable还是EQueryable呢?

    IQueryable继承自IEnumerable,所以对于数据遍历来说,它们没有区别。

    但是IQueryable的优势是它有表达式树,所有对于IQueryable的过滤,排序等操作,都会先缓存到表达式树中,只有当真正遍历发生的时候,才会将表达式树由IQueryProvider执行获取数据操作。

    而使用IEnumerable,所有对于IEnumerable的过滤,排序等操作,都是在内存中发生的。也就是说数据已经从数据库中获取到了内存中,只是在内存中进行过滤和排序操作。

     所以在数据较多的情况下或者操作比较复杂的情况下,IEnumerable的效率会比IQueryable低很多,返回的结果集可以是IEnumerable(此结果集也应该是经过IQueryable各种组合后所得来的)

  • 相关阅读:
    Java 常见异常种类
    Spring3.2+mybatis3.2+Struts2.3整合配置文件大全
    Java中的基本类型和引用类型变量的区别
    【git】Git 提示fatal: remote origin already exists 错误解决办法
    【Java集合】Java中集合(List,Set,Map)
    POJ3322-经典的游戏搜索问题
    程序人生[流程图]
    不使用中间变量交换两个数
    做人要低调,别把自己太当回事
    【转】嵌套子控件设计时支持
  • 原文地址:https://www.cnblogs.com/firstcsharp/p/12730862.html
Copyright © 2020-2023  润新知