C# 返回一个IEnumerable<;T>;或列表<;T>;从图书馆
我正在设计一个连接到数据源(类似于DB)并返回各种POCO对象的库 我使用datasource vendors.NET库建立连接(并检索对象),然后将其转换为更轻的POCO对象。为了构建这些POCO对象,我在每个POCO类(C# 返回一个IEnumerable<;T>;或列表<;T>;从图书馆,c#,C#,我正在设计一个连接到数据源(类似于DB)并返回各种POCO对象的库 我使用datasource vendors.NET库建立连接(并检索对象),然后将其转换为更轻的POCO对象。为了构建这些POCO对象,我在每个POCO类(.FromDBObject(dbobjectobj)上都有一个静态方法,它接受DB对象并返回一个新的POCO实例 到DB的初始连接速度不快,因此我不想在运行中(根据POCO构建)执行此操作,因此我正在围绕它包装一个库,用于管理连接,以限制这种速度减慢,并正确处理连接 作为这个
.FromDBObject(dbobjectobj)
上都有一个静态方法,它接受DB对象并返回一个新的POCO实例
到DB的初始连接速度不快,因此我不想在运行中(根据POCO构建)执行此操作,因此我正在围绕它包装一个库,用于管理连接,以限制这种速度减慢,并正确处理连接
作为这个库的一部分,我有许多方法返回我的POCO列表。DB对象的一个“奇怪之处”是,当供应商库加载它们时,它们没有加载到内存中,它们需要一个打开的连接来加载数据
因此,如果我返回一个IEnumerable
,则可能在枚举之前关闭连接(time/dispose),从而在创建POCO时崩溃
因此,一个简短的问题需要很长的时间
IEnumerable
,但在实际方法中执行.ToList()
以强制实例化,还是应该将返回类型指定为List
您的方法返回类型应该与您的数据访问没有多大关系。首先确定是要返回
IEnumerable
还是要返回List
。如果IEnumerable
足够,则使用ToList()
如果您需要
List
提供的额外方法,那么返回List
就可以了,因为它执行隐式ToList()
调用,尽管我会显式调用ToList()
无论如何,只是为了明确您希望在代码中的该点从数据库加载数据。您的方法返回类型应该与您的数据访问没有多大关系。确定您是要首先返回IEnumerable
还是列表
。如果IEnumerable
足够,则使用ToList()
如果您需要
List
提供的额外方法,那么返回List
就可以了,因为它执行隐式ToList()
调用,尽管我会显式调用ToList()
无论如何,只是为了明确您希望在代码中的该点从数据库加载数据。正如您所提到的,您必须已经强制对查询进行紧急求值。紧急求值有两种选择
1.ToList()
2.ToArray()
返回IList的利弊
如果使用者经常需要IList格式的数据,则您正在保存一个额外的枚举(因为您返回的是query.ToList()而不是query.ToArray()…如果订阅者需要该列表,则他们需要有效地调用query.ToArray().ToList(),从而导致双重枚举)。缺点是,将返回类型从ILIST更改为IEnumerable将是一种破坏
就我个人而言,我会选择IEnumerable,因为它所做的假设较少。我假设如果您真的需要IList方法,您可以添加一个特殊的ListFromDBObject(DbObject obj)方法,正如您提到的,您必须已经强制对查询进行急切求值。急切求值有两种选择 1.ToList() 2.ToArray() 返回IList的利弊 如果使用者经常需要IList格式的数据,则您正在保存一个额外的枚举(因为您返回的是query.ToList()而不是query.ToArray()…如果订阅者需要该列表,则他们需要有效地调用query.ToArray().ToList(),从而导致双重枚举)。缺点是,将返回类型从ILIST更改为IEnumerable将是一种破坏
就我个人而言,我会选择IEnumerable,因为它所做的假设较少。我假设如果您真的需要IList方法,您可以添加一个特殊的ListFromDBObject(DbObject obj)方法那么您正在包装的库返回IQueryable?否,我正在包装的库返回一个供应商自定义集合,然后我使用LINQSo访问和操作该集合。因此,您正在包装的库返回IQueryable?否,我正在包装的库返回一个供应商自定义集合,然后我使用LINQThis访问和操作该集合我最后做了什么。我认为显式的“ToList()”调用是最安全的选项。谢谢!这就是我最后做的。我认为显式的“ToList()”调用是最安全的选项。谢谢!