表达式不会立即过滤

时间:2015-03-31 23:29:33

标签: c# linq where-clause

请参阅下面的示例。 LINQ表达式要求_Age的学生对象列表在15到20之间。当我在调试器中看到varlist时,它显示5个条目。当我打印varlist时,它只打印一个条目,这是正确的。即使在打印之后,调试器也会在varlist中显示5个条目。这种行为是否记录在哪里,请告诉我。 如果列表中有很多条目(如数百万条),LINQ表达式实际上应该过滤项目。

public class Student
{
    public int StudentID { get; set; }
    public String StudentName { get; set; }
    public int Age { get; set; }
}

static void Main(string[] args)
{
    IList<Student> studentList = new List<Student>
    { 
        new Student { StudentID = 1, StudentName = "John", Age = 13 }, 
        new Student { StudentID = 2, StudentName = "Moin", Age = 21 }, 
        new Student { StudentID = 3, StudentName = "Bill", Age = 18 }, 
        new Student { StudentID = 4, StudentName = "Ram", Age = 20 }, 
        new Student { StudentID = 5, StudentName = "Ron", Age = 15 }
   };

    IEnumerable<Student> varlist = from rv in studentList
                                   where rv.Age > 15 && rv.Age < 20
                                   select rv;
    foreach (Student x in varlist)
    {
        Console.WriteLine("{0} {1}", x.Age, x.StudentName);
    }
}

2 个答案:

答案 0 :(得分:4)

这是延迟执行与Linq一起使用的方式。 Linq查询后面有一个表达式树,因此您可以将Linq查询视为数据结构。在您请求数据之前,您的查询不会执行,当编译该表达式时,这会在您枚举它时发生。

您可以在此处详细了解:

http://blogs.msdn.com/b/charlie/archive/2007/12/09/deferred-execution.aspx

IEnumerable<Customer> query = from customer in db.Customers  << Query does  
        where customer.City == "Paris" << not execute
        select customer;               << here 


foreach (var Customer in query) << Query executes here

无论您使用IEnumerable还是IQueryable来表示查询变量,两者都将使用延迟执行:

Returning IEnumerable<T> vs. IQueryable<T>

答案 1 :(得分:1)

LINQ的想法是你可以在实际执行之前在它上面添加操作。

如果您想强制LINQ计算结果,可以使用ToArray()

var arr = seq.ToArray();