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

Can*_*hiu 4 c# linq

我有一个简单的Linq查询:

var dict = (from i in Customers select i).ToDictionary(i => i.Id1, i => i.Id2);
Run Code Online (Sandbox Code Playgroud)

Linq2sql知道削减选择两个字段(Id1, Id2)虽然查询说select i

Jon*_*eet 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);
Run Code Online (Sandbox Code Playgroud)

另一种方法是自己做一个扩展方法 - 应该可以编写一个ToDictionary带两个表达式树(和目前为止的查询)的重载,并将它们组合成一个新的表达式树来创建一个键/值对,然后将其传递给Select,之后调用正常ToDictionary.如果你只做一次这样做可能不值得麻烦,但如果你在多个地方做这件事可能会有用.


Sam*_*ach 5

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

var dict = (from customer in Customers select new { customer.Id1, customer.Id2 })
           .ToDictionary(d => d.Id1, d => d.Id2);
Run Code Online (Sandbox Code Playgroud)