这个LINQ查询何时执行?

时间:2009-07-22 15:57:04

标签: c# linq

public class TestClass
{
    public TestClass(int id, string name)
    {
        Name = name;
        Id = id;
    }
    public string Name
    { get; private set; }

    public int Id
    { get; private set; }

    public string Tag
    { get; set; }

    public DateTime Time
    { get; set; }
}

 private static void Main(string[] args)
    {
        List<TestClass> list = new List<TestClass>();

        for (int i = 0; i < 5; i++ )
        {
            TestClass t = new TestClass(i, Guid.NewGuid().ToString());
            t.Tag = i%2 == 0?"Hello":"World";
            list.Add(t);
        }

        var query = list
            .GroupBy(l=>l.Tag);

        Func<IEnumerable<IGrouping<string, TestClass>>, int[]> func = GetIds<string,TestClass>;

        func.BeginInvoke(query, null, null);

        Console.Read();
    }

    private static int[] GetIds<T, U>(IEnumerable<IGrouping<T, U>> query)
    {
        List<int> ints = new List<int>();

        foreach(var y in query)
            ints.Add(y.Count());

        return ints.ToArray();
    }
}

我知道LINQ在迭代集合之前不会执行,但我只是想确保即使将查询传递给另一个异步方法,我也可以认为它仍然成立。

4 个答案:

答案 0 :(得分:16)

是的,查询执行仍然是延期的。该查询只是对IEnumerable<T>实现的引用,IEnumerable<T>实现了另一个{{1}}(以及适当的代理进行过滤,分组等)。

请注意,如果您再次迭代它(在任何线程中)将再次执行查询。查询引用知道如何获取数据 - 它不知道数据本身。

答案 1 :(得分:3)

据我了解,它仍将异步保持为真,但执行可能不是线程安全的。例如,LINQ to SQL的DataContexts不是线程安全的,因此LINQ to SQL查询不应该以这种方式在另一个线程中执行。

答案 2 :(得分:1)

当您致电ints.ToArray();时执行它并不重要,因为它在另一个线程中......

编辑:我立即纠正,它会在ForEach中执行......

答案 3 :(得分:1)

下图显示了完整的查询操作。在LINQ中,查询的执行与查询本身不同,见下文。

enter image description here

来源:: MSDN