代码之家  ›  专栏  ›  技术社区  ›  Kieran

LINQ to SQL或LINQ在什么时候向数据库发送请求

  •  2
  • Kieran  · 技术社区  · 16 年前

    我想让我的查询更好一些,但是我一直找不到一个资源,当一个查询被发送到数据库时,这个资源会被列出。

    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 回复  |  直到 16 年前
        1
  •  7
  •   Community Mohan Dere    9 年前

    任务是 _custName 需要向数据库发出任何请求吗?

    这取决于是否 Order.Customer 被懒散地装载。如果它装载得很慢,那么是的。否则,没有。

    顺便说一下,如果设置 DataContext.Log 财产:

    db.Log = Console.Out;
    

    然后您可以在控制台上观察SQL语句。通过单步执行程序,您可以准确地看到SQL语句何时访问数据库。

    查看上的msdn Deferred versus Immediate Loading .尤其是,你可以 turn off lazy loading .当心 SELECT N + 1 problem .

        2
  •  1
  •   Daniel Pratt    16 年前

    仅供参考,除了延迟加载之外,还有另一个原因,即当您期望使用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知道最多只能检索一条记录。