Вопрос

Я использую перечисление.

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

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

return (from term in dataContext.Terms
        where term.Name.StartsWith(text)
        select new { term.TermID, term.Name }).ToDictionary(t => t.TermID, t => t.Name);
Это было полезно?

Решение

Перечисление. Первая часть вашего утверждения "(от ... выберите термин") - это объект. Запрос будет рассмотреть выражение и построить заявление SQL. Затем он преобразует это в то, что он перешел к Todictionary ().

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

Другие советы

The generated SQL will return the entire term, so your second statement will bring down just what you need.

You can set dataContext.Log = Console.Out and look at the different results of the query.

Using my sample LINQPad database, here's an example:

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();

The generated SQL is (or just peek at LINQPad's SQL tab):

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

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

No. ToDictionary is an extension method for IEnumerable<T> not IQueryable<T>. It doesn't take an Expression<Func<T, TKey>> but simply a Func<T, TKey> that it'll blindly call for each item. It doesn't care (and doesn't know) about LINQ and the underlying expression trees and stuff like that. It just iterates the sequence and builds up a dictionary. As a consequence, in your first query, all columns are fetched.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top