Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 铸造一个IEnumerable<;张力>;到IEnumerable<;TResult>;在确保延期执行的同时_C#_Linq_Entity Framework_Ienumerable_Deferred Execution - Fatal编程技术网

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));