如果我使用 Linq 语句两次有什么关系吗?

jeb*_*jeb 3 c# linq

我想知道当我在一个对象上多次使用 linq 时这很重要。从性能角度来看,我应该将 First() 的结果存储在变量中还是可以更频繁地调用 First() ?

internal class Program
{
    public record Item(string FirstName, string LastName, int Age);

    static void Main(string[] args)
    {
        var items = new List<Item>
        {
            new Item("John", "Doe", 33),    
            new Item("Some", "Guy", 59)
        };

        // A First
        Console.WriteLine($"{items.First().FirstName}, {items.First().LastName}, {items.First().Age}");

        // B 
        var item = items.First();
        Console.WriteLine($"{item.FirstName}, {item.LastName}, {item.Age}");
    
    }
}
Run Code Online (Sandbox Code Playgroud)

First() 只是一个例子,它可能是关于 Last() 或Where()

Tim*_*ter 5

这取决于。例如,这取决于...

  • 如果它是 Linq-to-Objects 或 Linq-To-Entities(或 Linq-To-Sql 或其他)

如果它不在内存中,那么不是 Linq-To-Objects,您将一次又一次地执行查询,因此它会被多次发送到数据库。如果它已经在内存中,则取决于...

  • 它是带有索引器的集合(如数组或列表)还是“查询”

如果它是一个“物化”集合并且还IList<T>使用了索引器,那么items[0]这基本上是一个无操作。对于其他集合可能会有更多开销,必须枚举它才能获取第一个或(更糟糕)最后一个。

如果它不是“具体化”(在文档中搜索“延迟执行”,如下所示),例如

var items = someHugeCollection.Where(somecondition);
Run Code Online (Sandbox Code Playgroud)

现在你使用Firstor Last,它必须一次又一次地执行,这可能会很昂贵:

Console.WriteLine(items.First().FirstName, items.First().LastName, items.First().Age); 
Run Code Online (Sandbox Code Playgroud)

然后,您应该将集合保存在变量中(追加ToListToArray)或结果FirstLast(如果两者都需要,请将集合存储在变量中)。

因此,根据经验,如果您多次需要它,请将其保存在变量中