4

我正在使用 Enumerable.ToDictionary 从 linq 调用中创建字典:

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

该调用会获取每个术语的全部内容,还是只会从我的数据提供者那里检索 TermID 和 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);
4

3 回答 3

5

Enumerable.ToDictionary 适用于 IEnumerable 对象。您的语句“(from ... select term”) 的第一部分是一个 IQueryable 对象。Queryable 将查看表达式并构建 SQL 语句。然后它将其转换为 IEnumerable 以传递给 ToDictionary()。

换句话说,是的,您的第二个版本会更有效率。

于 2010-01-16T21:44:20.543 回答
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 是(或者只是查看 LINQPad 的 SQL 选项卡):

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

// 2nd approach
SELECT [t0].[OrderID], [t0].[OrderDate]
FROM [Orders] AS [t0]
于 2010-01-16T21:43:50.310 回答
1

No.ToDictionaryIEnumerable<T>not的扩展方法IQueryable<T>。它不需要一个,Expression<Func<T, TKey>>而只是一个Func<T, TKey>它会盲目地调用每个项目。它不关心(也不知道)LINQ 和底层表达式树之类的东西。它只是迭代序列并建立一个字典。因此,在您的第一个查询中,将获取所有列。

于 2010-01-16T21:43:42.790 回答