【问题标题】:LINQ multiple join hangingLINQ 多连接挂起
【发布时间】:2017-01-17 20:41:03
【问题描述】:

我有一个 LINQ 查询,我需要在其中加入 3 个表,但它似乎一直在评估表达式。

你觉得这有什么问题,或者有什么想法让我上吊吗? VS2010 输出窗口显示不同的线程以 0 退出。

这是 LINQ 表达式:

   var results = (from drECO in dtECO.AsEnumerable() 
                    join drBOMTo8 in dtBOM.AsEnumerable() on drECO.Field<string>("PN8Dig") equals drBOMTo8.Field<string>("PN8Dig")

                     from drBOMFrom8 in dtBOM.AsEnumerable ()
                     join drFAA8 in dtFAA.AsEnumerable () on drBOMFrom8.Field<string>("PN8Dig") equals drFAA8.Field <string>("PN8Dig")

                     from drBOMFromMon in dtBOM .AsEnumerable ()
                     join drFAAMon in dtFAA .AsEnumerable () on drBOMFromMon.Field <string>("Mon") equals drFAAMon.Field <string>("Mon")


                      select new
                     {
                         PN = drECO .Field <string>("PN"),
                         PNNEWREV = drECO.Field <string>("PNNewRev"),
                         PN8DIG = drECO.Field <string >("PN8Dig"),
                         ECO = drECO .Field <string >("ECO"),
                         MON = drFAAMon.Field <string>("Mon"),
                         SUPNUM = drFAAMon.Field <string>("SupNum"),
                         URL = drFAAMon.Field <string>("URL")
                     }).Distinct ();

【问题讨论】:

  • from drBOMmon in dtBOM.AsEnumerable() 将创建笛卡尔积。这是故意的吗?
  • 天啊。非常感谢。我不知道。 (作为一个方面,我是新手,这是我的第一个问题)我有 dtECO,我想通过 PN8Dig 链接到 dtBOM,然后我希望 dtBOM 用 Mon 链接到 dtURL。这个逻辑会创建笛卡尔连接吗?我希望它们都是内部连接。谢谢伊万。
  • 是的,它确实创建了笛卡尔积,因为它没有与之前的连接连接。要使其成为内部连接,您必须将其与 drECOdrBOM8Dig 相关联,例如而不是from drBOMmon in .. 你会使用join drBOMmon in ... on ...
  • 是的@Ivan。我需要 dtECO 通过 8DigPN 链接到 dtBom,并且需要 dtBom 通过 8DigPN 和 Mon 链接到 dtFAA。我已经更改了它,但它仍然挂起。
  • 如果你用你所做的更新问题会很好。另外,如果您将 Distinct() 替换为 Count() 会发生什么(只是为了测试) - 它是否完成并且结果编号是多少?

标签: c# linq multiple-tables


【解决方案1】:

根据我的经验,当提供者、它的驱动程序或提供者与之交谈的底层数据库出现问题时,LINQ 会出现挂起和奇怪的控制流问题。

如果您使用的数据库可以分析已执行的查询,请使用该机制查看该层发生的情况。如果它甚至没有到达那里,请将该信息添加到您的问题中。

【讨论】:

  • 我使用的是数据表对象,而不是数据库。
【解决方案2】:

答案在来自@Ivan 的初始问题的 cmets 部分中,因为“挂起”是因为它试图执行笛卡尔连接。修复了 LINQ。 “它确实创建了笛卡尔积,因为它与之前的连接没有连接。要使其成为内部连接,您必须将其与 drECO 或 drBOM8Dig 相关联,例如,而不是 from drBOMmon in ..您将使用 join drBOMmon in ...在……”

【讨论】:

  • 您应该将该评论引用到您的答案中,因为该用户可能会删除该评论,从而使您的答案无用。
猜你喜欢
  • 2019-10-14
  • 2021-12-22
  • 2014-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多