为什么在LINQ中使用多个WHERE谓词比使用多个AND要慢

本文关键字:AND 要慢 谓词 WHERE LINQ 为什么 | 更新日期: 2023-09-27 18:22:30

经常使用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;
}

时间成本结果总是在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;
}

时间成本总是小于5

为什么在LINQ中使用多个WHERE谓词比使用多个AND要慢

您甚至没有执行这个LINQ查询。你只是在定义它。

例如,如果你使用foreachToList()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++;
}

连续的Where和连续的&&之间应该没有太大的差异。

我最近问了一个类似的问题:LINQ:具有多个条件的单个Where和具有单个条件的连续Where之间的差异

您可能还发现这个问题有助于理解LINQ延迟执行的好处:LINQ中延迟执行的优点是什么?