京东云服务器推荐配置、多种配置选择,满足不同业务需求!

热门推荐

⭐ 稳定入门选择

配置:2核2G/5M

适用场景:个人站点 / 轻量应用

特点:性价比高,稳定可靠

¥19/月
立即购买
流量友好

☁️ 轻量云主机

配置:2核4G 5M

适用场景:小型业务 / 博客 / 测试环境

特点:流量友好,性能均衡

¥149/年
立即购买
高性能

💻 云服务主机

配置:4核16G 8M

适用场景:中小型服务 / 多并发场景

特点:充足内存与带宽,性能强劲

¥750/年
立即购买
新人专享

🎁 新人福利

新人访问 → 点击 → 最新活动

可获取 3000元 礼券

立即领取
服务端 / LINQ 教程 / LINQ 菜鸟教程
LINQ 延迟执行查询
LINQ 立即执行查询LINQ 表达式树

LINQ 延迟执行查询

延迟执行意味着表达式的求值被延迟到实际需要的时候。它通过避免不必要的执行,极大地提高了性能。

延迟执行适用于任何内存集合以及远程LINQ提供程序,例如LINQ-to-SQL,LINQ-to-Entities,LINQ-to-XML等。

让我们使用以下示例了解延迟执行:

延迟执行

在上面的示例中,您可以看到在使用foreach循环进行迭代时查询已实现并执行。这称为延迟执行。当您实际访问集合中的每个对象并对其进行处理时,LINQ会处理studentList集合。

延迟执行将返回最新数据

要检查每次延迟执行是否每次都返回最新数据,请在foreach循环后再添加一名青少年Ager学生,并检查青少年学生列表:

延迟执行

正如您看到的,第二个foreach循环再次执行查询并返回最新数据。延迟执行在每次执行时重新计算;这被称为惰性求值。这是延迟执行的主要优点之一:它总是为您提供最新的数据。

实现延迟执行

您可以使用c#的 yield 关键字为IEnumerable的自定义扩展方法实现延迟执行。

例如,您可以为IEnumerable实现自定义扩展方法GetTeenAgerStudents,该方法将返回所有青少年学生的列表。

public static class EnumerableExtensionMethods
{
    public static IEnumerable<Student> GetTeenAgerStudents(this IEnumerable<Student> source)
    {

        foreach (Student std in source)
        {
            Console.WriteLine("Accessing student {0}", std.StudentName);

            if (std.age > 12 && std.age < 20)
                yield return std;
        }
    }
}

请注意,每当GetTeenAgerStudents()被调用时,我们都会在控制台上打印学生姓名。

现在,您可以使用以下扩展方法:

    C#:

IList<Student> studentList = new List<Student>() { 
            new Student() { StudentID = 1, StudentName = "John", age = 13 } ,
            new Student() { StudentID = 2, StudentName = "Steve",  age = 15 } ,
            new Student() { StudentID = 3, StudentName = "Bill",  age = 18 } ,
            new Student() { StudentID = 4, StudentName = "Ram" , age = 12 } ,
            new Student() { StudentID = 5, StudentName = "Ron" , age = 21 } 
        };
            
var teenAgerStudents = from s in studentList.GetTeenAgerStudents() 
                        select s;

foreach (Student teenStudent in teenAgerStudents)
    Console.WriteLine("Student Name: {0}", teenStudent.StudentName);
输出:
Accessing student John
Student Name: John
Accessing student Steve
Student Name: Steve
Accessing student Bill
Student Name: Bill
Accessing student Ram
Accessing student Ron

从输出中可以看到,GetTeenAgerStudents()当您使用foreach循环迭代studentList时,将被调用。

延迟执行
延迟执行

因此,通过这种方式,您可以使用yield关键字创建自定义方法,以获得延迟执行的优势。

LINQ 立即执行查询LINQ 表达式树
上一篇:LINQ 表达式树