C# 铸造一个IEnumerable<;张力>;到IEnumerable<;TResult>;在确保延期执行的同时
在我的应用程序中,有相当多的现有“服务命令”,它们通常返回C# 铸造一个IEnumerable<;张力>;到IEnumerable<;TResult>;在确保延期执行的同时,c#,linq,entity-framework,ienumerable,deferred-execution,C#,Linq,Entity Framework,Ienumerable,Deferred Execution,在我的应用程序中,有相当多的现有“服务命令”,它们通常返回列表。然而,我编写它们的方式是,直到最后一个语句,当它们被转换为ToList(或者至少我认为我这样做了)时,才会对任何查询进行计算 现在,我需要开始从命令中获取一些“特定于上下文”的信息,我正在考虑执行以下操作: 保持现有命令与现在的命令基本相同,但确保它们返回的是IEnumerable,而不是IList 创建调用旧命令但返回IEnumerable的新命令,其中TResult不是实体,而是视图模型、结果模型等-对应用程序有用的数据表示形式
列表
。然而,我编写它们的方式是,直到最后一个语句,当它们被转换为ToList
(或者至少我认为我这样做了)时,才会对任何查询进行计算
现在,我需要开始从命令中获取一些“特定于上下文”的信息,我正在考虑执行以下操作:
IEnumerable
,而不是IList
IEnumerable
的新命令,其中TResult
不是实体,而是视图模型、结果模型等-对应用程序有用的数据表示形式组
实体时。在我的模式中,组
带有用户
特定的权限,但在我的结果中吐出整个用户和权限列表是不现实的-第一,因为可能有很多用户,第二,因为有很多权限,第三,因为这些信息不应该提供给特权不足的用户(即“来宾”不应该看到“成员”可以做什么)
因此,我希望能够获取原始命令的结果,一个IEnumerable
,并描述每个组
应该如何转换为GroupResult
,给定一个用户
(在本例中通过用户名
)的特定输入
如果我尝试使用ForEach
迭代原始命令的结果,我知道这将强制执行结果,因此可能导致不必要的更长执行时间。如果我想进一步合成“new”命令的结果(返回GroupResult
)并过滤掉某些组,该怎么办?然后,也许我会为输入的用户计算大量的特权,但最终还是会过滤掉父GroupResult
对象
我想我的问题可以归结为。。。如何告诉C#我希望如何转换IEnumerable
的每个成员,而不必在方法运行时进行转换?您正在寻找该命令
当您定义一个返回IEnumerable
的方法,并通过yield return
返回其数据时,返回值将在消费方法中迭代。这就是它可能的样子:
IEnumerable<GroupResult> GetGroups(string userName)
{
foreach(var group in context.Groups.Where(g => <some user-specific condition>))
{
var result = new GroupResult()
... // Further compose the result.
yield return result;
}
}
要将枚举从一种类型惰性地强制转换为另一种类型,请执行以下操作:
IEnumerable<TResult> result = source.Cast<TResult>();
每次迭代可枚举项时,它都会创建一个新的DB
实例,并在完成可枚举项时处理数据库。值得考虑的事情
使用NuGet并查找交互式扩展的“Ix Main”。您是否可以不使用
。选择(group=>newgroupresult(…)
?
IEnumerable<TResult> result = source.Cast<TResult>();
var d =
EnumerableEx
.Using(
() => new DB(),
db => db.Data.Where(x => x == 2));