一个名为
我无法选择权限系统,也无法选择不使用
SourceManager
的类有一个静态构造方法,它会遍历所有模块和类并发现实现了ISource
接口的类。它会实例化每个类,并将它们作为一个静态属性IEnumerable<ISource> Sources
暴露出来。为简单起见,ISource
只有两个属性:DataTable Table { get; }
和string UniqueName { get; }
。每个不同的ISource
在被实例化时负责从SQL、MDX等中填充其自身的Table
。对于我目前编写的所有ISource
,在实例化时用所有的DataRow
填充Table
已经足够了。然而现在我遇到了这样一种情况:我想用延迟加载的方式加载Table
中的DataRow
,而不是一次性加载所有的数据。我该怎么做呢?下面我将通过一个示例进行讲解。
PermissionSource
实现了ISource
接口。它的Table
属性是私有设置的,并赋值为new PermissionDataTable()
。它的UniqueName
是"Permissions"
。目前为止,还没有从数据库中加载任何权限到这个Table
属性中。ISource permissionSource = SourceManager.Sources.
Where(s => "Permission".Equals(s.UniqueName)).First();
现在我们已经通过接口获取了PermissionSource
。让我们获取权限。
DataRow row = permissionSource.Table.Rows.Cast<DataRow>().
Where(r => r["PermissionName"].Equals("PermissionName")).First()
我已经在 PermissionDataTable
中重写了 Rows
属性,这样就可以以某种方式获取与数据库中的 "PermissionName"
相关联的权限值。其他权限不会被加载。我无法选择权限系统,也无法选择不使用
DataTable
。
编辑:
在我的示例中,我需要重写 DataTable
的 Rows
属性。然而,Rows
是一个 DataRowCollection,它是 sealed
的。因此,在创建像我想要的最小自定义 DataTable 实现方面,实际上没有什么可以做的。
DataTable
不会从数据库加载任何数据,你应该使用 Entity Framework。 - SLaksDataTable
总是一个内存对象,没有延迟执行或流式处理的能力。你可能想要使用DataReader
或者在数据库中完成所有操作。 - Tim Schmelter