在我的应用程序中,我正在撤回用户的“提要”。这包含了该用户的所有活动,事件,来自其他用户的朋友请求等。当我撤回Feed时,我正在调用各种函数来过滤请求。
var userFeed = GetFeed(db); // Query to pull back all data
userFeed = FilterByUser(userFeed, user, db); // Filter for the user
userFeed = SortFeed(userFeed, page, sortBy, typeName); // Sort it
返回的数据正是我所需要的,但是当我查看SQL配置文件跟踪时,我可以看到获取此数据的查询不会在数据库级别对其进行过滤,而是选择所有数据。表(一个或多个)。
在我遍历视图中的结果之前,此查询不会执行。所有这些函数都返回一个IEnumerable对象。
我的印象是,LINQ将占用我的所有过滤器并形成一个查询以撤回我想要的数据,而不是撤回所有数据,然后在服务器上过滤它。
我做错了什么或者我对LINQ评估查询的方式有什么理解?
答案 0 :(得分:4)
如果GetFeed返回IEnumerable,则FilterByUser将收到IEnumerable。当它调用一些LINQ运算符时,即Where,它将使用IEnumerable Where,它将开始询问信息,最终将下载整个表。将GetFeed的类型更改为IQueryable以确保调用IQueryable的LINQ运算符,这将继续延迟查询。