这是一个返回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列。
答案 0 :(得分:4)
您的第一个查询是只是一个查询,它还没有返回任何内容。您需要使用ToList
,ToArray
等来迭代查询以获取结果。
您在第二个代码段中迭代了您的查询,您实际请求字段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查询。