使用LINQ to Entities进行左连接时超时

时间:2011-03-02 23:59:27

标签: asp.net linq-to-entities timeout left-join

我有以下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()。

1 个答案:

答案 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
          };

如果你想要别的东西,请澄清它是什么。