为什么LINQ使用多个WHERE谓词使用多个AND更慢?

dan*_*004 -2 .net c# linq visual-studio

经常使用LINQ来过滤对象数组

我运行了一个产生相同结果的测试表达式,但是在不同的时间,我想知道这种行为的原因.

public long testTimeOperetionWHERE()
{
    Object[] list = opCoIn.getList();
    System.Diagnostics.Stopwatch sw = System.Diagnostics.Stopwatch.StartNew();


    int i = 0;
    while (i<20000)
    {
        var result = list.Where(o => o.Id>0)
                     .Where(o => o.Import>0)
                     .Where(o => o.OrderConfirm==o.NumberConfirm)
                     .Where(o => o.IdActiveCustomer>100 );
        i++;
    }

    long e = sw.ElapsedMilliseconds; 

    return e;
}
Run Code Online (Sandbox Code Playgroud)

时间成本结果总是在90-80之间变化

在这种情况下

public long testTimeOperetionAND()
{
    Object[] list = opCoIn.getList();
    System.Diagnostics.Stopwatch sw = System.Diagnostics.Stopwatch.StartNew();


    int i = 0;
    while (i < 20000)
    {
        var result = list.Where(o => o.Id > 0
                                && o.Import > 0
                                && o.OrderConfirm==o.NumberConfirm
                                && o.IdActiveCustomer>100);

        i++;
    }

    long e = sw.ElapsedMilliseconds; 

    return e;
}
Run Code Online (Sandbox Code Playgroud)

时间成本总是小于5

Tim*_*ter 5

您甚至没有执行此LINQ查询.你只是在定义它.

如果您要使用foreach,ToList()或者Count()您将获得更有意义的结果.

while (i < 20000)
{
    var result = list.Where(o => o.Id > 0
                            && o.Import > 0
                            && o.OrderConfirm==o.NumberConfirm
                            && o.IdActiveCustomer>100); // not executed
    int justToExecuteIt = result.Count();               // executed here
    i++;
}
Run Code Online (Sandbox Code Playgroud)

连续Wheres和连续之间应该没有很大的区别&&.

我最近问了一个类似的问题:LINQ:单个Where和多个条件之间的区别和单个条件的连续Wheres

您可能还会发现这个问题对于理解LINQ延迟执行的好处很有用:在LINQ中延迟执行有什么好处?