【问题标题】:at what point does linq-to-sql or linq send a request to the databaselinq-to-sql 或 linq 在什么时候向数据库发送请求
【发布时间】:2010-01-28 23:48:02
【问题描述】:

我想让我的查询变得更好,但一直无法找到一个资源,该资源在将查询发送到数据库时进行布局。

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 的赋值是否需要向数据库提出任何请求?

【问题讨论】:

  • 任何资源链接也将不胜感激。

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


【解决方案1】:

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

这取决于Order.Customer 是否被延迟加载。如果它是延迟加载的,那么是的。否则,不行。

顺便说一句,如果您设置DataContext.Log 属性,您可以轻松调查此问题:

db.Log = Console.Out;

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-27
      • 2011-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-18
      • 1970-01-01
      相关资源
      最近更新 更多