Queryable
No. класс, такие вещи, как LINQ к 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
. Это, вероятно, не стоит хлопот, если вы делаете это только один раз, но если вы делаете это в нескольких местах, это может быть полезно.
Мне любопытно, не зависит ли TODictionary от реализации поставщика LINQ? Или ToDictionary не является частью LINQ? – rossisdead
@rossisdead: Это часть LINQ to Objects - это не часть Queryable, только Enumerable. –
Gotcha, спасибо! – rossisdead