如果它的选择呈现两次,LINQ会缓存一个值吗?

时间:2009-10-25 00:47:49

标签: c# .net linq

我对LINQ进行DataTable次查询:

var list = from row in table.AsEnumerable()
group row by row.Field<byte>("ID") into g
select new
{
   ID = g.Key,
   Name = (from c in g
      select c.Field<string>("name")).First(),
   Localized = (from c in g
      select myDic[c.Field<string>("name"))].First();
};

其中ID是主要列,Name - 来自查询的数据和Localized - 字典中的值,其中key - 来自查询的数据(Name)。

LINQ缓存来自第二个select的查询的数据,或者我必须以另一种方式执行此操作?

还有一个问题:如果我将字典创建选中,那么它每次都会被创作吗?

2 个答案:

答案 0 :(得分:2)

LINQ不进行任何类型的查询分析/优化(参见下面的注释)。而是使用C#"let" clause(映射到SelectMany method)来捕获该值一次,以便在select语句中重用。这是您修改过的查询:

var list = from row in table.AsEnumerable()
group row by row.Field<byte>("ID") into g
let name = (from c in g
            select c.Field<string>("name")).First()
select new
{   
    ID = g.Key,   
    Name = name,
    Localized = myDic[name]
};

注意:如果需要,IQueryable提供程序可以在技术上将LINQ表达式转换为更优化的表达式,但这是另一个讨论的主题,无论如何你在这里使用纯粹的“LINQ to Objects”。 / p>

答案 1 :(得分:1)

LINQ不会缓存数据。因此,它将为每个组的每个元素执行字典查找。