我有以下LINQ查询执行左连接:
var results = from v in ctx.dat_Visitor
join sp in ctx.vwSP on v.lu_Mentor.ID equals sp.ID into sp2
select new {
Visitor = v.Name,
Tot = sp2.Count(),
SP2 = sp2
};
我的问题是这个LINQ查询超时了。我甚至将默认超时从15秒提升到120秒,但它仍然超时。
dat_Visitor中的记录不超过10条,但vwSP(视图)大约有100,000条记录。
我确定超时与我尝试在结果中实际返回sp2时有关。如果我将LINQ查询更改为不在结果中返回sp2,那么它很快。没有sp2,查询看起来像这样:
var results = from v in ctx.dat_Visitor
join sp in ctx.vwSP on v.lu_Mentor.ID equals sp.ID into sp2
select new {
Visitor = v.Name,
Tot = sp2.Count()
};
最后,我正在使用3.5框架,但我正在认真考虑将网站升级到4.0,因为我可以使用DefaultIfEmpty()。
答案 0 :(得分:1)
我不确定你要在这里完成什么,但是你的第一个查询实际上会返回每个v
的所有100K行。当你让服务器对它们执行一些操作时,没关系。但是,一旦你真的尝试在网络上移动它们,那真的会让你付出代价。
您看,sp2
不是来自vwSP
的行,而是vwSP
中与当前v
对应的序列行}。
如果您想为每个sp
检索一个v
,请返回sp2.FirstOrDefault()
而不是sp2
。
如果您想要使用相应的sp
检索所有v
,则可以像这样修改您的查询:
var results = from v in ctx.dat_Visitor
join sp in ctx.vwSP on v.lu_Mentor.ID equals sp.ID into sps
from sp in sps
select new {
Visitor = v.Name,
Tot = sps.Count(),
SP2 = sp
};
如果你想要别的东西,请澄清它是什么。