List,IList,IEnumerable,IQueryable,ICollection,哪个是最灵活的返回类型?

时间:2010-08-24 18:42:23

标签: .net linq-to-sql architecture collections

我之前在这里发过这个问题但是我不满意我理解完整的后果。问题是返回类型应该是使用linq-to-sql的数据层返回以获得最大的灵活性和查询能力。这是我读过/发现的内容:

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

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

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

  4. 永远不应该使用IQueryable,它应该“使用和关闭”。 IQueryable不会返回列表,但会为数据库生成查询语法。

  5. 我觉得我对交易感觉更好,但仍然不确定一些事情:

    1. 为什么我会选择具体类型的界面变体?即IList或ICollection与列表或集合。我会得到什么好处?

    2. 我看到扩展操作有效,但扩展后的查询语法也能正常工作吗?

    3. 有人建议我之前使用AsQueryable()。但是,如果我没有连接到数据库,为什么我会这样做呢?似乎扩展方法无论如何都可以工作。

3 个答案:

答案 0 :(得分:29)

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

答案 1 :(得分:7)

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

就返回哪个界面而言,您应该考虑方法的目的和调用者的意图。如果您返回一个集合,调用者是否应该能够更改集合?例如添加/删除项目?如果他们需要做的只是枚举它(做一个foreach)那么你应该只返回一个IEnumerable。

答案 2 :(得分:3)

1)最好返回一个IList,以便将结果放入实现该接口的任何对象中,而不是强制调用者使用List。例如,调用者可能希望将结果返回给ArrayList,如果将结果返回到List,则无法执行此操作。 ArrayList不从List继承,但确实实现了IList。