IQueryable&选择新的

时间:2015-01-21 15:34:12

标签: c# linq entity-framework linq-to-sql

这是一个返回Note对象的IQueryable的函数。

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

            return notes;
    }

在下面的代码中,我调用上面的函数并使用note id列表创建自己的对象。

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

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

我有一个疑问,因为在SqlGetNotes中我正在使用&#39;选择n&#39;然后我使用&#39;选择新的&#39;。

我想编写IQueryable,只能从数据库中读取Id列。

2 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:0)

您是否通过在调用.ToList()?

之前和之后放置断点来观察探查器的行为

来自MSDN:

  

IQueryable接口继承IEnumerable接口,因此如果它表示查询,则可以枚举该查询的结果。枚举导致与IQueryable对象关联的表达式树被执行。 &#34;执行表达式树的定义&#34;特定于查询提供程序。例如,它可能涉及将表达式树转换为底层数据源的适当查询语言。   块引用

这意味着只要我有一个IQueryable对象,我就可以做其他的事情就像做一个.Select()进行投影(就像你用select new做的那样)或{{1如果需要,可以应用过滤,而不执行后端查询。但只有在枚举之前(例如ToList()调用List&lt;&gt;构造函数,它将使用IQueryable对象的GetEnumerator()来填充容器)它是否会实际调用数据源并执行SQL查询。