在下面的Linq2Sql查询中,有人可以告诉我
1)什么时候sql查询发送到sql server?
a)当查询分配了表达式或
时 在foreach循环中需要时,b)(延迟执行)?
var query = from c in myDataContext.Customers
where c.FirstName == 'Tom'
select c;
foreach(customer cust in query)
{
//...do something
}
2) .NET应用程序或SQL Server是否将表达式树转换为SQL查询?我问这个的原因是因为
a)我在表达式树上所做的所有阅读都说需要它们才能通过线路发送代码以便动态执行而不是发送MSIL。
b)如果我将表达式分配给查询,我已经可以看到它已将其更改为SQL
如果.NET应用程序进行了转换,那么如何通过线路将表达式树发送到sql server呢?它只是发送了sql字符串。
答案 0 :(得分:2)
只要绝对需要,查询就会被发送到数据库 - 通常是在您开始实际请求数据时。
换句话说,它可能是对GetEnumerator()
的调用或对IEnumerator<T>.MoveNext()
的第一次调用。
C#编译器将lambda表达式转换为IL,在执行时生成表达式树对象。然后,LINQ to SQL将该表达式树转换为SQL以发送到数据库。
LINQ to SQL需要表达式树,以便拥有代码的“数据”表示,以便在执行时将其转换为SQL。它仍然是通过网络发送的SQL,但是需要表达式树来创建该SQL。
此类博客上有很多博文,包括this one by me。