linq-to-sql或linq在什么时候向数据库发送请求
我想让我的查询更好,但是无法找到一个资源,当查询被发送到数据库时。
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的赋值是否需要向数据库发出任何请求?
_custName
的赋值是否需要向数据库发出任何请求?
这取决于Order.Customer
是否延迟加载。 如果它是懒惰加载,那么是的。 否则,没有。
顺便说一下,如果设置DataContext.Log
属性,则可以轻松地进行调查:
db.Log = Console.Out;
然后,您可以在控制台上查看SQL语句。 通过单步执行程序,您可以确切地看到SQL语句何时命中数据库。
查看延迟与立即加载的 MSDN。 特别是,您可以关闭延迟加载 。 注意SELECT N + 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知道最多只能检索一条记录。