gpt4 book ai didi

c# - IEnumerable 和 Take(x) 问题?

转载 作者:太空狗 更新时间:2023-10-30 00:05:31 27 4
gpt4 key购买 nike

(使用 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 ,据编译器所知,empIEnumerable<T> , 不是 IQueryable<T> , 因此内存中的版本被调用。

关于c# - IEnumerable<T> 和 Take(x) 问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11157206/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com