c# - 将 IQueryable linq 查询转换为 IEnumerable<T> 会取消 linq 优化的工作方式吗?

标签 c# performance linq

我是 .NET 的新手,我想知道 linq 是如何工作的,因为您可以一个接一个地应用许多 linq 查询,但在用于传输信息或转换之前,它们都不会真正执行列出等
使用 IQueryable<T> 有两种获取 linq 查询的重要方法,它直接在 Sql 上应用 where 过滤器,而 IEnumerable 获取所有记录,然后在内存中与它们一起使用。但是,让我们看一下这段代码:

            //Linq dynamic library
            IQueryable<Table> myResult = db.Categories
                .Where(a => a.Name.Contains(StringName))
                .OrderBy("Name")
                .Skip(0)
                .Take(10);

            if (myResult != null)
            {
                return myResult.AsEnumerable();
            } 
            else
            { return null; }

尽管我正在使用 Linq 动态库,但此查询的直接结果正在 IQueryable<T> 上获取,如果查询最终返回为 IEnumerable ,查询真的在sql上被过滤了吗?还是在内存中?

最佳答案

它仍然会在数据库中执行,不用担心。基本上都取决于 Where 的实现。等被使用。当您在 IQueryable<T> 上调用方法时- 通过 Queryable扩展方法——它将使用表达式树。当您开始从该查询中获取时,它将变成 SQL 并发送到数据库。

另一方面,如果您在 之后使用这些方法中的任何一种,您将得到它作为 IEnumerable<T> (就编译时类型而言),这将使用 Enumerable 中的扩展方法,所有其余处理在进程内完成。

举个例子,考虑一下:

var query = db.People
              .Where(x => x.Name.StartsWith("J"))
              .AsEnumerable()
              .Where(x => x.Age > 20);

在这里AsEnumerable() 只是 返回其输入序列,但输入为 IEnumerable<T> .在这种情况下,数据库查询将只返回姓名以 J 开头的人。 - 然后年龄过滤将在客户端完成。

关于c# - 将 IQueryable linq 查询转换为 IEnumerable<T> 会取消 linq 优化的工作方式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14842176/

相关文章:

c# - 使用 Newtonsoft 解析 JSON 数组

c# - 确保在不复制代码的情况下执行 dll 所需的安装操作

c# - 在 Visual Studio App Center for Xamarin iOS : Unsafe code may only appear if compiling with/unsafe 中构建失败

c++ - 为什么省略 push_back 会使循环运行得更慢?

c# - 从 Entity Framework 中的集合加载相关实体

c# - 未应用 Web API Gzip

performance - 改进 PostgreSQL 中小数据文本搜索的好处和权衡

javascript - 迭代器函数的 this 与 currentValue

c# - 常见 Linq 表达式的示例

c# - LINQ 多对多关系 : Solution?