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

Cur*_*ite 48 .net architecture collections linq-to-sql

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

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

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

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

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

我觉得我对折衷有更好的感觉,但仍然不确定一些事情:

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

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

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

Rex*_*x M 29

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

  • @Rex:虽然我同意你的结论,但我建议DAL不应该订购集合.这属于客户端/消费者/业务逻辑.即`MyDal.ListCustomers().OrderBy(InvoiceDate)`. (3认同)
  • @Curtis你应该总是返回一个接口,这样你就可以在没有人知道或关心的情况下改变返回对象内部的逻辑. (2认同)
  • "集合通常对DAL返回非常有用,因为集合不会隐含地保证订单." - 但是IEnumerable也不是你的推荐.就个人而言,如果实现可能是延迟评估的,我只返回IEnumerable,不太可能是DAL结果.返回IList可以保证调用者可以多次枚举结果,并提供Count属性. (2认同)

Tre*_*ley 7

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

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