【问题标题】:Linq to Sql multiple outer joinsLinq to Sql 多个外连接
【发布时间】:2020-11-05 09:52:52
【问题描述】:

提前感谢您的帮助。 无论如何都不是 Linq to Sql 的专家。 我有 4 张桌子。

主 lb_item 表毫无疑问地定义了一个项目。 许多字段,但包含 3 个 ID 字段。 itemID(键) 类别ID(非空) patternID(可以为空)

lb_pattern 表,它以 lb_item 模式 ID 为键。

lb_category 表以 lb_item categoryID 为键。

lb_animal 表,它以 lb_item 项目 ID 为键。

所以我需要从 lb_item 表中选择一个连接到这 3 个表的选择,以在我构建 DTO 时带回 varchar 字段。

单个左外连接可以正常工作:

from lbi in lbContext.lb_item
            join lbp in lbContext.lb_pattern on lbi.patternID equals lbp.patternID into g1
            from j1 in g1.DefaultIfEmpty()
            join lbc in lbContext.lb_category on lbi.categoryID equals lbc.categoryID
            where lbi.itemID == id
            select new lb_itemDTO..........

我现在需要为 lb_animal 表添加第二个左外连接。 于是我开始这样做:

from lbi in lbContext.lb_item
            join lbp in lbContext.lb_pattern on lbi.patternID equals lbp.patternID into g1
            from j1 in g1.DefaultIfEmpty()
            join lba in lbContext.lb_animal on j1.

但是 VS 中 j1 的选项只给了我 lb_pattern 表中的字段。 我需要加入才能阅读:

join lba in lbContext.lb_animal on j1.itemID equals lba.itemID

join lba in lbContext.lb_animal on lbi.itemID equals lba.itemID

这两种方法都不起作用,并给我一个异常,类似于“'NavigationExpandingExpressionVisitor' failed。这可能表明 EF Core 中存在错误或限制”。

那么如何向 lb_animal 表添加左外连接?

我花了最后一个小时查看各种 SO 帖子以解决问题,但由于某种原因,我似乎无法理解解决方案。感觉像个新手。而且我相信解决方案会很明显!

任何帮助或解决方案的指针将不胜感激。

【问题讨论】:

    标签: c# entity-framework model-view-controller linq-to-sql


    【解决方案1】:

    这应该可行:

    var ans = from lbi in lbContext.lb_item
              where lbi.itemID == id
              join lbp in lbContext.lb_pattern on lbi.patternID equals lbp.patternID into lbpj
              from lbp in lbpj.DefaultIfEmpty()
              join lba in lbContext.lb_animal on lbi.itemID equals lba.itemID into lbaj
              from lba in lbaj.DefaultIfEmpty()
              join lbc in lbContext.lb_category on lbi.categoryID equals lbc.categoryID
              select new {
              };
    

    【讨论】:

    • 感谢您的回答。如您所见,我确实自己解决了。但。您能否告诉我,您的解决方案在生成 SQL 的方式上是否比我实施的解决方案有任何性能优势?我不是一个大的 SO 玩家,所以不介意给自己一个答案的功劳。但我喜欢做的就是学习。因此,如果您对此感到困扰,我们将不胜感激详细说明您的答案。再次感谢您抽出宝贵时间回复。
    【解决方案2】:

    坚持不懈,终于遇到了一个 SO 帖子,它以不同的方式接近它并且它起作用了。 原来的 SO 是 here:

    我的工作代码现在是这样的:

    from lbi in lbContext.lb_item
                from lbc in lbContext.lb_category
                  .Where(c => c.categoryID == lbi.categoryID)
                from lbp in lbContext.lb_pattern
                  .Where(p => p.patternID == lbi.patternID)
                  .DefaultIfEmpty()
                from lba in lbContext.lb_animal
                  .Where(a => a.itemID == lbi.itemID)
                  .DefaultIfEmpty()
                where lbi.itemID == id
                select new lb_itemDTO
    

    仍然会对此解决方案的 cmets 感兴趣,因为它不会将外部连接分解为分组段。那么,与我最初建议的方法相比,我发现这个解决方案在它生成的 SQL 方面的效率是否更低?

    【讨论】:

    • 我的测试表明这应该生成与我发布的完整流畅版本完全相同的 SQL,因此应该执行相同 (EF 3.1)。
    猜你喜欢
    • 2010-09-21
    • 2011-11-13
    • 2013-06-13
    • 1970-01-01
    • 2014-08-25
    • 2011-10-14
    • 1970-01-01
    • 2010-11-10
    相关资源
    最近更新 更多