我想计算相关表的行:
MainTable tbl = tblInfo(id);
var count = tbl.Related_Huge_Table_Data.Count();
Run Code Online (Sandbox Code Playgroud)
问题是:这需要太长时间(大约20秒)才能执行,尽管当我在Sql Server中运行此查询时,它执行时间不到一秒钟.如何在linq中优化此查询?我也试过使用存储过程,但没有运气.
这是tblInfo方法:
public MainTable tblInfo(int id)
{
MyDataContext context = new MyDataContext();
MainTable mt = (from c in context.MainTables
where c.Id == id
select c).SingleOrDefault();
return mt;
}
Run Code Online (Sandbox Code Playgroud)
我使用LinqToSql,类由LinqToSql生成.
鉴于我在Linq To Sql模型中有三个表(Customer,Orders和OrderLines)
客户 - 一对多 - >订单 - 一对多 - > OrderLines
我用的时候
var customer = Customers.First();
var manyWay = from o in customer.CustomerOrders
from l in o.OrderLines
select l;
Run Code Online (Sandbox Code Playgroud)
我看到一个查询获得客户,这是有道理的.然后我看到客户订单的查询,然后是每个订单获得订单行的单个查询,而不是加入两个订单.总共n + 1个查询(不包括获取客户)
但是,如果我使用
var tableWay = from o in Orders
from l in OrderLines
where o.Customer == customer
&& l.Order == o
select l;
Run Code Online (Sandbox Code Playgroud)
然后,我没有看到每个订单获得订单行的单个查询,而是看到连接两个表的单个查询.共1个查询(不计入客户)
我更喜欢使用第一个Linq查询,因为它对我来说似乎更具可读性,但为什么L2S不像我在第一个查询中所期望的那样加入表?使用LINQPad我看到第二个查询被编译成SelectMany,虽然我没有看到第一个查询的变化,不确定这是否是我的查询中某些问题的指示.