迭代Linq Lookup将为每次迭代创建一个db查询

时间:2018-01-16 13:11:39

标签: c# entity-framework linq

我正在使用Entity Framework,并且假设我在DB中存储了一些类:

class A
{
  public int Foo { get; set; }
  public int Bar { get; set; }
}

现在,如果我开始迭代ToLookup这样的结果:

var data = db.Data.ToLookup(x => x.Foo);
foreach (var group in data)
{
    Console.WriteLine(group.Key);

    foreach (var item in group)
    {
        // use item... Console.WriteLine("\t" + item.Bar);
    }
}

此代码是否只生成一个查询?

每次迭代都会向DB查询吗?或者ToLookup的结果是否已实现,所以它就像迭代一些内存中的IEnumerable一样?

1 个答案:

答案 0 :(得分:2)

没有ToLookup(这个IQueryable,...)。但是,有一个Enumerable.ToLookup(this IEnumerable, ...)

此函数将IEnumerable作为输入。每个使用延迟执行的LINQ函数都在其描述中对此进行了注释。

显然ToLookup不使用延迟执行,因此只要你调用它,它就会获取输入参数并枚举所有元素。

此行为与ToList()相当:查询将只执行一次,所有枚举数据将在用于创建查找表之前在一个查询中被带到本地内存。