(使用 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/

10-11 15:19