(使用 Entity Framework )
当我写:
IEnumerable<string> q = customers /*EF entity*/
.Select (c => c.Name.ToUpper())
.OrderBy (n => n)
c# 编译器知道如何发出表达式树,然后 sql 执行:
SELECT UPPER (Name) FROM Customer ORDER BY UPPER (Name)
还要注意
order by
子句在那里但
我看到了 this link :
他写了 :
IEnumerable<employee> emp =
dc.Employees.Where(x => x.Desc.StartsWith("soft"));
emp = emp.Take(1);
在调查了最后一个查询后,他看到:
SELECT [t0].[Id], [t0].[Name], [t0].[Address], [t0].[Desc] AS [Desc]
FROM [dbo].[Employee] AS [t0]
WHERE [t0].[Desc] LIKE @p0
注意有 没有
top
子句这是为什么 ?
Take(x)
不应该添加到查询中吗?会这样写:
IEnumerable<employee> emp =
(dc.Employees.Where(x => x.Desc.StartsWith("soft"))).Take(1);
会在发送到 SQL 的查询中添加 TOP 子句吗?
这是怎么回事?
(我已经知道
take
不是延迟执行) 最佳答案
Take()
等扩展方法是静态方法,因此它们在编译时解析。
emp 的编译时类型是 IEnumerable<employee>
(因为它被显式声明为 1),因此编译器选择 Enumerable.Take
而不是 Queryable.Take
,它不执行任何查询转换。
如果你很懒惰并且只使用 var
而不是类型名称:
var emp = dc.Employees.Where(x => x.Desc.StartsWith("soft"));
emp = emp.Take(1);
它会起作用,因为编译器会为 emp 选择
IQueryable<employee>
(因为你用它初始化的表达式是那种类型),因此为第二次调用选择 Queryable.Take
。关于c# - IEnumerable<T> 和 Take(x) 问题?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11157206/