linq-to-sql或linq在什么时候向数据库发送请求

时间:2010-01-28 23:48:02

标签: c# asp.net linq linq-to-sql

我想让我的查询更好,但是无法找到一个资源,当查询被发送到数据库时。

DBContext db = new DBContext();
Order _order = (from o in db
                where o.OrderID == "qwerty-asdf-xcvb"
                select o).FirstOrDefault();
String _custName = _order.Customer.Name +" "+_order.Customer.Surname;

_custName的赋值是否需要向数据库发出任何请求?

2 个答案:

答案 0 :(得分:7)

  

_custName的分配是否需要向数据库发出任何请求?

这取决于Order.Customer是否延迟加载。如果它是懒惰的,那么是的。否则,没有。

顺便说一句,如果设置DataContext.Log属性:

,则可以轻松调查此问题
db.Log = Console.Out;

然后,您可以在控制台上查看SQL语句。通过单步执行程序,您可以确切地看到SQL语句何时命中数据库。

Deferred versus Immediate Loading上查看MSDN。特别是,你可以turn off lazy loading。注意SELECT N + 1 problem

答案 1 :(得分:1)

仅供参考,除了延迟加载之外,还有另一个原因可能导致在使用LINQ时期望数据库活动不会发生。例如,如果我稍微更改您的示例代码:

DBContext db = new DBContext();
var orders = (from o in db
            where o.OrderID == "qwerty-asdf-xcvb"
            select o);
var order = orders.FirstOrDefault();
String _custName = _order.Customer.Name +" "+_order.Customer.Surname;

不熟悉LINQ工作方式的人可能希望在执行第二行代码时从数据库中检索所有订单。实际上,LINQ延迟查询数据库直到最后一刻,在这种情况下是对FirstOrDefault的调用。当然,此时LINQ知道最多只能检索一条记录。