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

标签 c# .net linq entity-framework .net-4.0

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

相关文章:

.net - DotNetNuke 文件管理

c# - 如何在保持打开状态的同时将 "this.ShowInTaskBar"更改为 "form.ShowDialog()"?

c# - 如何使用C#从字符串列表中提取公共(public)部分

c# - 获取目录名称的数字版本时出错

xml - LINQ 到 XML : parsing XML file which one of nodes presents type of another node

c# - 统一 5.8 : registration by convention "Inheritance security rules violated"

c# - 当逆变导致歧义时,没有警告或错误(或运行时失败)

c# - 为什么 Console.WriteLine() 函数会遗漏字符串中的某些字符?

c# - 使用内部构造函数实例化类

c# - 具有不同数据类型数组作为值的字典