(使用 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);
是否会将 TOP 子句添加到发送到 SQL 的查询中?
这是怎么回事?
(我已经知道take
不是延迟执行)
最佳答案
如果您添加了 Take(1)
对于第一个表达式,它将在 IQueryable<T>
上, 从而添加到 SQL 中。但是自从你转换了IQueryable<T>
至 IEnumerable<T>
, Take(1)
在内存中完成:IEnumerable<T>
有一个同名的 Take()
extension method ,据编译器所知,emp
是IEnumerable<T>
, 不是 IQueryable<T>
, 因此内存中的版本被调用。
关于c# - IEnumerable<T> 和 Take(x) 问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11157206/