4

我有一个简单的Linq查询:

var dict = (from i in Customers select i).ToDictionary(i => i.Id1, i => i.Id2);

尽管查询说,是否Linq2sql知道将选择减少到两个字段 ( ) ?Id1, Id2select i

4

3 回答 3

7

不。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。如果你只做一次,这可能不值得麻烦,但如果你在多个地方做这件事,它可能会很有用。

于 2013-04-18T16:20:06.610 回答
5

没有 LINQToSQL 无法知道为您削减Select。您需要使用匿名类型。见下文。

var dict = (from customer in Customers select new { customer.Id1, customer.Id2 })
           .ToDictionary(d => d.Id1, d => d.Id2);
于 2013-04-18T16:21:16.990 回答
3

据我所知,它没有。它将评估您的查询并检索表上的所有字段Customers

你可以重写它,所以它做到了:

var dict = (
    from i in Customers
    select new
    {
        i.Id1,
        i.Id2
    })
    .ToDictionary(i => i.Id1, i => i.Id2);
于 2013-04-18T16:19:47.373 回答