List,IList,IEnumerable,IQueryable,ICollection,这是最灵活的返回types?

我以前在这里看过这个问题,但是我并不满意,我理解完整的后果。 问题是什么返回types应该使用linq-to-sql的数据层返回最大的灵活性和查询能力。 这是我读过/发现的:

  1. IEnumerable是有限的,只允许读取前进操作。 IEnumerable是最通用的。 我发现IEnumerable确实允许查询操作与扩展语法。

  2. 列表允许最大的灵活性,因为插入操作。

  3. 应该使用集合而不是列表来启用只读集合。

  4. 不应该使用IQueryable,应该“使用和closures”。 IQueryable不会返回一个列表,但会为数据库生成一个查询语法。

我觉得我有一个更好的感觉权衡,但仍然不确定几件事情:

  1. 为什么我会select具体types的接口变体? 即IList或ICollection vs列表或集合。 我会得到什么好处?

  2. 我看到扩展操作的工作,但扩展查询语法的工作呢?

  3. 有人build议我以前使用AsQueryable()。 但是,如果我没有连接到数据库,为什么要这样做呢? 看来扩展方法无论如何工作。

集合对于DAL返回通常不是非常有用,因为集合不会隐式地保证顺序。 这只是一桶物品。 另一方面,IList确实隐含地保证秩序。 所以我们归结为IEnumerable或IList。 接下来的问题是:List对象是“活”的吗? 即,它是否连接到数据支持,以便当您将项目添加到IList时,它将反映在数据库中? 对于LINQ到SQL,情况并非如此。 相反,你应该把实体附加到表中。 所以除非你提供这个额外的接线,否则一个List是多余的。 坚持IEnumerable。

IEnumerable <> =>允许在集合上使用“foreach”

ICollection <> => IEnumerable <> + Add(),Remove(),Count,Clear(),Contains(),IsReadOnly,CopyTo()

IList <> =>作为ICollection <> + this [int],Insert(),IndexOf(),RemoveAt()。 即。 它增加了索引types列表操作符

•可以使用“回报率” 结合IEnumerable <>一次只返回1个对象。 这是IEnumerable的真正威力来自哪里(而不是简单地返回一个列表或一个数组)。

•返回列表时,决定可以向用户公开的内容并返回适当的types。

•也许最好返回一个ICollection <>或IList <>,如果代码客户端只需枚举列表,他们可以将它转换为IEnumerable <>。 即。 给定ICollection SomeMethod()…用户可以调用它作为IEnumerable部件= SomeMethod()

你应该总是返回一个接口,而不是一个具体的types,这是不言而喻的,因为它指定了允许的行为,而不需要将消费者绑定到特定的实现。

根据哪个接口返回,你应该考虑方法的目的和调用者的意图。 如果你返回一个集合,那么调用者是否可以改变集合呢? 例如添加/删除项目? 如果他们需要做的就是枚举它(做一个foreach),那么你应该只返回一个IEnumerable。

1)最好返回一个IList,以便将结果放入实现该接口的任何对象中,而不是强制调用者使用List。 例如,调用者可能希望将结果返回给ArrayList,如果将结果返回给List,则这是不可能的。 ArrayList不会从Listinheritance,但它确实实现了IList。