linq:ToDictionary会减少返回的列数吗?

时间:2013-04-18 16:17:01

标签: c# linq

我有一个简单的Linq查询:

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

尽管查询显示Linq2sql,但Id1, Id2知道将选区缩减为两个字段(select i)吗?

3 个答案:

答案 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);