我想让我的查询更好,但是无法找到一个资源,当查询被发送到数据库时。
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的赋值是否需要向数据库发出任何请求?
答案 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知道最多只能检索一条记录。