C# 返回一个IEnumerable<;T>;或列表<;T>;从图书馆

C# 返回一个IEnumerable<;T>;或列表<;T>;从图书馆,c#,C#,我正在设计一个连接到数据源(类似于DB)并返回各种POCO对象的库 我使用datasource vendors.NET库建立连接(并检索对象),然后将其转换为更轻的POCO对象。为了构建这些POCO对象,我在每个POCO类(.FromDBObject(dbobjectobj)上都有一个静态方法,它接受DB对象并返回一个新的POCO实例 到DB的初始连接速度不快,因此我不想在运行中(根据POCO构建)执行此操作,因此我正在围绕它包装一个库,用于管理连接,以限制这种速度减慢,并正确处理连接 作为这个

我正在设计一个连接到数据源(类似于DB)并返回各种POCO对象的库

我使用datasource vendors.NET库建立连接(并检索对象),然后将其转换为更轻的POCO对象。为了构建这些POCO对象,我在每个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()”调用是最安全的选项。谢谢!