我对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
的查询的数据,或者我必须以另一种方式执行此操作?
还有一个问题:如果我将字典创建选中,那么它每次都会被创作吗?
答案 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不会缓存数据。因此,它将为每个组的每个元素执行字典查找。