【发布时间】:2011-04-03 08:35:35
【问题描述】:
我之前在这里看到过这个问题,但我不满意我了解完整的后果。问题是使用 linq-to-sql 的数据层应该返回什么返回类型,以获得最大的灵活性和查询能力。这是我读过/发现的:
IEnumerable 是有限的,只允许向前读操作。 IEnumerable 是最通用的。我发现 IEnumerable 确实允许查询操作而不是扩展语法。
由于插入操作,列表允许最大的灵活性。
应该使用集合而不是列表来启用只读集合。
永远不应该使用 IQueryable,它应该“使用并关闭”。 IQueryable 不返回列表,而是为数据库生成查询语法。
我觉得我对权衡的感觉更好,但仍然不确定一些事情:
为什么我要选择接口变体而不是具体类型?即 IList 或 ICollection 与 List 或 Collection。我会得到什么好处?
我看到扩展操作有效,但扩展查询语法也有效吗?
之前有人建议我使用 AsQueryable()。但是,如果我没有与数据库的连接,我为什么要这样做呢?看来扩展方法无论如何都可以工作。
【问题讨论】:
-
从您的问题中删除“列表”类。 IList、IEnumerable、IQueryable 等都是接口,而“List”是一个类。在您的问题中,“列表”类是橘子中的一个苹果。
-
@Stargazer 这是问题的一部分,使用 IList 与 List 有什么好处。我现在正在写一些例子。
-
@Curtis,这就是我要说的:List 实现了 IList,因此 是 一个 IList。它们是苹果和橙子,我觉得你不明白其中的区别。重新表述涉及两者之间差异的问题的更好方法是,“返回类和返回接口有什么区别?”
-
@Stargazer 我知道接口和类是什么。我知道一个类实现了接口,接口作为契约。我的问题是返回 IList
与 List 的实际区别是什么(或是否存在明显区别)? -
不同之处在于 IList 为您提供的功能。 IList 是一个接口,因此它允许您抽象实际返回的内容。如果您的函数返回一个 IList,并且有一天您决定更改该函数的工作方式,那么您可以将其更改为返回 实现 IList 的东西。另一方面,如果您返回一个列表,您将永远受该决定的约束。要更改它,您必须更改任何依赖该函数返回列表的内容。底线:为参数和返回值使用接口。在函数中使用具体类型。
标签: .net linq-to-sql architecture collections