2009-10-25 37 views
0

我有一个LINQ查询到DataTableWIll LINQ缓存一个值,如果选择它两次?

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或我必须以另一种方式执行此操作?

还有一个问题:如果我将字典创建放在select中,每次都会被创建吗?

回答

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到对象“无论如何。

1

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

相关问题