2009-10-25 45 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不會緩存數據。因此,它將爲每個組的每個元素執行字典查找。