我有一个简单的Linq
查询:
var dict = (from i in Customers select i).ToDictionary(i => i.Id1, i => i.Id2);
尽管查询显示Linq2sql
,但Id1, Id2
知道将选区缩减为两个字段(select i
)吗?
答案 0 :(得分:7)
没有。 LINQ to SQL所依赖的Queryable
类不包含ToDictionary
的声明(并且没有其他类具有合适的扩展方法),因此最终使用{{3}中的实现 - 即LINQ to Objects。它使用普通代理而不是表达式树,所以 可以计算出所需要的内容真的没有明智的方法。
为了提高查询效率,请使用匿名类型捕获Select
部分中您需要的所有内容:
var dict = db.Customers
// Here i is a full Customer, logically...
.Select(i => new { i.Id1, i.Id2 })
// But here p is just the pair of Id1, Id2
.ToDictionary(p => p.Id1, p => p.Id2);
另一个替代方法是自己做一个扩展方法 - 应该可以编写一个带有两个表达式树(和目前为止的查询)的ToDictionary
的重载,并将它们组合成一个新的表达式树创建一个键/值对,然后将其传递给Select
,然后调用正常的ToDictionary
。如果你只做一次这样做可能不值得麻烦,但如果你在多个地方做这件事可能会有用。
答案 1 :(得分:5)
没有LINQToSQL无法知道为你减少Select
。您需要使用匿名类型。见下文。
var dict = (from customer in Customers select new { customer.Id1, customer.Id2 })
.ToDictionary(d => d.Id1, d => d.Id2);
答案 2 :(得分:3)
据我所知,事实并非如此。它会评估您的查询并检索Customers
表中字段中的所有。
你可以重写它,所以:
var dict = (
from i in Customers
select new
{
i.Id1,
i.Id2
})
.ToDictionary(i => i.Id1, i => i.Id2);