LINQ – 使用DataLoadOptions 提高LINQ to SQL 查询性能
2008-07-02 10:54
726 查看
[align=center]LINQ – 使用DataLoadOptions 提高LINQ to SQL 查询性能[/align]
[align=right]EntLib.com开源小组发表,http://www.EntLib.com,2008-7-2[/align]
LINQ to SQL 提供了 DataLoadOptions用于立即加载对象,避免往返访问数据库,提高查询性能。方法包括:
LoadWith 方法,用于立即加载与主目标相关的数据。
AssociateWith 方法,用于筛选为特定关系检索到的对象。
如下LINQ to SQL代码示例:
[align=left] OrderDataContext orderDC;[/align]
[align=left] orderDC = new OrderDataContext();[/align]
[align=left] orderDC.Log = Console.Out;[/align]
[align=left] [/align]
[align=left] DataLoadOptions dataLoadOption = new DataLoadOptions();[/align]
[align=left] dataLoadOption.LoadWith<Order>(r => r.Order_Details);[/align]
[align=left] orderDC.LoadOptions = dataLoadOption;[/align]
[align=left] [/align]
[align=left] var query = from ord in orderDC.Orders[/align]
[align=left] select ord;[/align]
[align=left] [/align]
[align=left] grdOrder.DataSource = query;[/align]
[align=left] grdOrderDetail.DataSource = grdOrder.DataSource;[/align]
grdOrderDetail.DataMember = "Order_Details";
通过使用LoadWith 方法指定应同时检索与主目标Order相关的Order Detail 数据,这样后续的查询方法仅访问一次数据库,并可同时获取Order、Order Detail 的所有信息。
如下是输出的SQL脚本:
[align=left]SELECT [t0].[OrderID], [t0].[CustomerID], [t0].[EmployeeID], [t0].[OrderDate], [t0].[RequiredDate], [t0].[ShippedDate], [t0].[ShipVia], [t0].[Freight], [t0].[ShipName], [t0].[ShipAddress], [t0].[ShipCity], [t0].[ShipRegion], [t0].[ShipPostalCode], [t0].[ShipCountry], [t1].[OrderID] AS [OrderID2], [t1].[ProductID], [t1].[UnitPrice], [t1].[Quantity], [t1].[Discount], ([/align]
[align=left] SELECT COUNT(*)[/align]
[align=left] FROM [dbo].[Order Details] AS [t2][/align]
[align=left] WHERE [t2].[OrderID] = [t0].[OrderID][/align]
[align=left] ) AS [value][/align]
[align=left]FROM [dbo].[Orders] AS [t0][/align]
[align=left]LEFT OUTER JOIN [dbo].[Order Details] AS [t1] ON [t1].[OrderID] = [t0].[OrderID][/align]
[align=left]ORDER BY [t0].[OrderID], [t1].[ProductID][/align]
使用 AssociateWith 方法指定子查询以限制检索的数据量。
在下面的示例中,AssociateWith 方法将检索的 Orders 限制为当天尚未装运的那些 Orders。如果没有此方法,则会检索所有 Orders,即使只需要一个子集。
DataLoadOptions dlo = new DataLoadOptions();
dlo.AssociateWith<Customer>(c => c.Orders.Where(p => p.ShippedDate != DateTime.Today));
db.LoadOptions = dlo;
var custOrderQuery =
from cust in db.Customers
where cust.City == "London"
select cust;
[align=right]EntLib.com开源小组发表,http://www.EntLib.com,2008-7-2[/align]
LINQ to SQL 提供了 DataLoadOptions用于立即加载对象,避免往返访问数据库,提高查询性能。方法包括:
LoadWith 方法,用于立即加载与主目标相关的数据。
AssociateWith 方法,用于筛选为特定关系检索到的对象。
如下LINQ to SQL代码示例:
[align=left] OrderDataContext orderDC;[/align]
[align=left] orderDC = new OrderDataContext();[/align]
[align=left] orderDC.Log = Console.Out;[/align]
[align=left] [/align]
[align=left] DataLoadOptions dataLoadOption = new DataLoadOptions();[/align]
[align=left] dataLoadOption.LoadWith<Order>(r => r.Order_Details);[/align]
[align=left] orderDC.LoadOptions = dataLoadOption;[/align]
[align=left] [/align]
[align=left] var query = from ord in orderDC.Orders[/align]
[align=left] select ord;[/align]
[align=left] [/align]
[align=left] grdOrder.DataSource = query;[/align]
[align=left] grdOrderDetail.DataSource = grdOrder.DataSource;[/align]
grdOrderDetail.DataMember = "Order_Details";
通过使用LoadWith 方法指定应同时检索与主目标Order相关的Order Detail 数据,这样后续的查询方法仅访问一次数据库,并可同时获取Order、Order Detail 的所有信息。
如下是输出的SQL脚本:
[align=left]SELECT [t0].[OrderID], [t0].[CustomerID], [t0].[EmployeeID], [t0].[OrderDate], [t0].[RequiredDate], [t0].[ShippedDate], [t0].[ShipVia], [t0].[Freight], [t0].[ShipName], [t0].[ShipAddress], [t0].[ShipCity], [t0].[ShipRegion], [t0].[ShipPostalCode], [t0].[ShipCountry], [t1].[OrderID] AS [OrderID2], [t1].[ProductID], [t1].[UnitPrice], [t1].[Quantity], [t1].[Discount], ([/align]
[align=left] SELECT COUNT(*)[/align]
[align=left] FROM [dbo].[Order Details] AS [t2][/align]
[align=left] WHERE [t2].[OrderID] = [t0].[OrderID][/align]
[align=left] ) AS [value][/align]
[align=left]FROM [dbo].[Orders] AS [t0][/align]
[align=left]LEFT OUTER JOIN [dbo].[Order Details] AS [t1] ON [t1].[OrderID] = [t0].[OrderID][/align]
[align=left]ORDER BY [t0].[OrderID], [t1].[ProductID][/align]
使用 AssociateWith 方法指定子查询以限制检索的数据量。
在下面的示例中,AssociateWith 方法将检索的 Orders 限制为当天尚未装运的那些 Orders。如果没有此方法,则会检索所有 Orders,即使只需要一个子集。
DataLoadOptions dlo = new DataLoadOptions();
dlo.AssociateWith<Customer>(c => c.Orders.Where(p => p.ShippedDate != DateTime.Today));
db.LoadOptions = dlo;
var custOrderQuery =
from cust in db.Customers
where cust.City == "London"
select cust;
相关文章推荐
- LINQ : 在LINQ TO SQL中关闭ObjectTrackingEnabled提高性能
- 在LINQ to SQL中使用Translate方法以及修改查询用SQL
- 在LINQ to SQL中使用Translate方法以及修改查询用SQL
- LINQ学习笔记(三)之LINQ to SQL 查询语句使用方法一
- LINQ : 在LINQ TO SQL中关闭ObjectTrackingEnabled提高性能
- LINQ to SQL系列三 使用DeferredLoadingEnabled,DataLoadOption指定加载选项
- 在LINQ to SQL中使用Translate方法以及修改查询用SQL
- 在LINQ to SQL中使用Translate方法以及修改查询用SQL 推荐
- 在LINQ to SQL中使用Translate方法以及修改查询用SQL
- LINQ to SQL 查询数据库和使用存储过程
- MVC中使用LINQ TO SQL实现多表查询及分页
- Linq to Sql中Single写法不当可能引起的数据库查询性能低下
- 如何提高LINQ-to-SQL延时加载的性能
- LINQ to SQL 查询数据库和使用存储过程
- AdoNet vs LinqToSql vs NIntegrateQuery查询性能测试
- MVC中使用Linq To Sql进行数据查询及分页
- Oracle模糊查询之(3.2从使用函数和sql语法角度来提高模糊查询效率 二)ORACLE中Like与Instr模糊查询性能大比拼
- 学习并使用了两种linq to entity 的实现sql关键字in的查询方法
- 提高sql查询性能-使用instr函数替换like
- LINQ To SQL 中查询语句的使用