首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在LINQ中使用2个where子句的性能

在LINQ中使用2个where子句的性能
EN

Stack Overflow用户
提问于 2013-10-15 17:16:57
回答 3查看 2.7K关注 0票数 19

在LINQ-to-Entities中,可以通过执行以下操作来查询实体:

代码语言:javascript
复制
var students = SchoolContext.Students.Where(s => s.Name == "Foo" && s.Id == 1);

我知道在幕后,它将被转换为SQL,类似于:

代码语言:javascript
复制
SELECT *
FROM Students
WHERE Name = 'Foo' AND Id = 1

但是,如果我写:

代码语言:javascript
复制
var students = 
    SchoolContext.Students
        .Where(s => s.Name == "Foo")
        .Where(s => s.Id == 1);

它会被转换成相同的SQL查询吗?根据我的理解,.Where()将返回IEnumerable<T>,因此第二个.Where()将过滤内存中的实体,而不是将IQueryable<T>转换为SQL,对吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-10-15 17:21:44

第一个.Where()子句仍将返回IQueryable<T>。只要你在IQueryable<T>上操作,它就会继续构建SQL查询,并在需要将集合放入内存时执行它(例如:在foreach循环或ToList()操作中使用时,@anaximander声明)。

因此:

代码语言:javascript
复制
SchoolContext.Students.Where(s => s.Name == "Foo").Where(s => s.Id == 1);

仍然会转化为:

代码语言:javascript
复制
SELECT *
FROM Students
WHERE Name = 'Foo' AND Id = 1

而以下两个语句将转换为相同的查询:

代码语言:javascript
复制
SchoolContext.Students.Where(s => s.Name == "Foo").Where(s => s.Id == 1);
SchoolContext.Students.Where(s => s.Name == "Foo" && s.Id == 1);
票数 19
EN

Stack Overflow用户

发布于 2013-10-15 17:19:14

首先,Where返回IQueryable<T>,因此不会有性能差异。

票数 7
EN

Stack Overflow用户

发布于 2013-10-15 17:24:03

获取Linqpad,并在那里尝试不同的查询。您可以直接向您的实体添加连接,运行查询,并查看在每种情况下生成哪种SQL。体验Linq的绝佳方式。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19377449

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档