IQueryable & select 新

IQueryable & select new

这是一个 returns IQueryableNote 个对象的函数。

private IQueryable<Note> SqlGetNotes()
{
    //only notes belonging to memoboard
    var notes = from n in _db.Notes select n;
    return notes;
}

在下面的代码中,我调用了上面的函数并创建了我自己的对象,仅包含笔记 ID 列表。

var noteItems = (from n in SqlGetNotes()
                 select new
                 {
                     Id = n.NoteId,
                 }).ToList();

我的问题是,上面的查询会首先加载 Note 对象的所有列,还是只加载 NoteId 列?

我有疑问,因为在 SqlGetNotes 中我使用了“select n”,然后我使用了“select new”。

我想编写 IQueryable 这样的方式,以便只从数据库中读取 Id 列。

您的第一个查询只是一个查询,它还没有返回任何内容。您需要迭代查询以获得结果,使用 ToListToArray

您在第二个代码片段中迭代了您的查询,您实际上在其中请求了字段 NoteId 并使用 ToList 迭代了您的查询。

因此,您生成的 SQL 查询只会 select NoteId 而不是所有列。您可以使用 SQL 探查器查看从 LINQ 表达式实际生成的查询。

您是否通过在调用 .ToList() 之前和之后放置断点来观察分析器的行为?

来自 MSDN:

The IQueryable interface inherits the IEnumerable interface so that if it represents a query, the results of that query can be enumerated. Enumeration causes the expression tree associated with an IQueryable object to be executed. The definition of "executing an expression tree" is specific to a query provider. For example, it may involve translating the expression tree to an appropriate query language for the underlying data source.

这意味着只要我有一个 IQueryable 对象,我就可以用它做其他事情,比如做一个 .Select() 投影(就像你用 select new) 或 .Where() 以在需要时应用过滤,而不执行后端查询。但只有在它被枚举之前(例如 ToList() 调用 List<> 构造函数,它将使用 IQueryable 对象的 GetEnumerator() 来填充容器),它才会真正调用数据源和执行 SQL 查询。