是否首先返回完整列表,然后在使用linq to sql过滤来自数据库或仅过滤列表的数据时进行过滤?

时间:2010-05-11 14:15:31

标签: asp.net-mvc linq linq-to-sql

这可能是我在MVC项目中正在进行的一个非常简单的问题。以下是我所谈论的一个例子。

我有一个rdml文件链接到一个数据库,其中一个名为Users的表有500,000行。但我只想找到2010年5月7日输入的用户。所以我想在我的UserRepository中这样做:

来自u的db.GetUsers()中的

,其中u.CreatedDate =“5/7/2010”选择你
(从内存中执行此操作,所以如果我的语法稍微偏离,请不要杀了我,这是我正在寻找的概念)

此语句是首先返回所有500,000行,然后对其进行过滤还是只返回已过滤的列表?

4 个答案:

答案 0 :(得分:3)

由于您在ITable返回IQueryable<T>数据源的顶部构建表达式,因此会在数据库中进行过滤。

答案 1 :(得分:1)

Linq to SQL在将查询发送到数据库之前将其转换为SQL,因此只返回过滤后的列表。

答案 2 :(得分:1)

执行查询时,它将创建SQL以仅返回已过滤的集。

要注意的一件事是,如果你对该查询的结果一无所知,那么根本不会查询任何内容。

查询将推迟到您枚举结果集。

善,

答案 3 :(得分:0)

这些人是正确的,我建议的一个建议是监控LinqToSql正在创建的查询。 LinqToSql是一个很棒的工具,但它并不完美。通过监视它创建的查询并在需要的地方稍微调整它,我注意到了一些效率低下的问题。

DataContext有一个“Log”属性,您可以使用它来查看创建的查询。我创建了一个简单的HttpModule,它将DataContext的Log(格式化为sweetness)输出到我的输出窗口。这样我就可以看到它使用的SQL并在需要时进行调整。它的价值在于它的重量。

附注 - 我并不是要对LinqToSql创建的SQL持否定态度,因为它几乎每次都非常好用和高效。监视查询的另一个好的副作用是你可以向你的朋友们展示那些顽固的ADO.NET - Stored Proc人员LinqToSql的效率如何。