我有一个简单的Linq
查询:
var dict = (from i in Customers select i).ToDictionary(i => i.Id1, i => i.Id2);
尽管查询说,是否Linq2sql
知道将选择减少到两个字段 ( ) ?Id1, Id2
select i
不。Queryable
像 LINQ to SQL 这样的东西所依赖的类不包含声明ToDictionary
(并且没有其他类具有合适的扩展方法),因此它最终使用实现Enumerable
- 即 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
。如果你只做一次,这可能不值得麻烦,但如果你在多个地方做这件事,它可能会很有用。
没有 LINQToSQL 无法知道为您削减Select
。您需要使用匿名类型。见下文。
var dict = (from customer in Customers select new { customer.Id1, customer.Id2 })
.ToDictionary(d => d.Id1, d => d.Id2);
据我所知,它没有。它将评估您的查询并检索表上的所有字段Customers
。
你可以重写它,所以它做到了:
var dict = (
from i in Customers
select new
{
i.Id1,
i.Id2
})
.ToDictionary(i => i.Id1, i => i.Id2);