4

Я использую Enumerable.ToDictionary создать словарь офф LinQ вызова:Перечисляет ли Enumerable.ToDictionary только то, что ему нужно?

return (from term in dataContext.Terms 
     where term.Name.StartsWith(text) 
     select term).ToDictionary(t => t.TermID, t => t.Name); 

достанет, что вызов полноту каждого термина, или он будет только извлечь Termid и поле Имени из моих данных провайдер? Другими словами, я бы экономить себя трафик базы данных вместо того, чтобы, если я написал это так:

return (from term in dataContext.Terms 
     where term.Name.StartsWith(text) 
     select new { term.TermID, term.Name }).ToDictionary(t => t.TermID, t => t.Name); 

ответ

5

Enumerable.ToDictionary работает на IEnumerable объектов. Первая часть вашего утверждения «(из ... select term») является объектом IQueryable. Queryable будет искать выражение и строить инструкцию SQL. Затем он преобразует это в IEnumerable, чтобы перейти к ToDictionary().

Другими словами, да, ваша вторая версия будет более эффективной.

1

No. ToDictionary является метод расширения для IEnumerable<T> не IQueryable<T>. Он не принимает Expression<Func<T, TKey>>, а просто Func<T, TKey>, который он будет вслепую требовать для каждого элемента. Он не заботится (и не знает) о LINQ и основных деревьях выражений и тому подобное. Он просто выполняет итерацию последовательности и создает словарь. Как следствие, в вашем первом запросе извлекаются все столбцы.

3

Сгенерированный SQL вернет весь термин, поэтому ваш второй оператор уменьшит то, что вам нужно.

Вы можете установить dataContext.Log = Console.Out и посмотреть на различные результаты запроса.

Используя свою базу данных образец LINQPad, вот пример:

var dc = (TypedDataContext)this; 

// 1st approach 
var query = Orders.Select(o => o); 
dc.GetCommand(query).CommandText.Dump(); 
query.ToDictionary(o => o.OrderID, o => o.OrderDate).Dump(); 

// 2nd approach 
var query2 = Orders.Select(o => new { o.OrderID, o.OrderDate}); 
dc.GetCommand(query2).CommandText.Dump(); 
query2.ToDictionary(o => o.OrderID, o => o.OrderDate).Dump(); 

Сгенерированный SQL является (или просто взглянуть на вкладке SQL LINQPad в):

// 1st approach 
SELECT [t0].[OrderID], [t0].[OrderDate], [t0].[ShipCountry] 
FROM [Orders] AS [t0] 

// 2nd approach 
SELECT [t0].[OrderID], [t0].[OrderDate] 
FROM [Orders] AS [t0]