Linq to Sql 多个外部连接

Linq to Sql multiple outer joins

在此先感谢您的帮助。 无论如何都不是 Linq to Sql 的专家。 我有 4 tables.

主要 lb_item table 不出所料,它定义了一个项目。 许多字段,但包含 3 个 ID 字段。 itemID(键) 类别 ID(不为空) patternID(可以为空)

lb_pattern table which is keyed off the lb_item patternID.

lb_category table which is keyed off the lb_item categoryID.

lb_animal table which is keyed off the lb_item item ID.

所以我需要 lb_item table 中的 select 连接到其他 3 个 table 以在我构建 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 table 添加第二个左外连接。 所以我开始这样做:

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 table 中的字段。 我需要加入阅读:

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' 失败。这可能表示 EF Core 中存在错误或限制”。

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

我花了最后一个小时查看各种 SO 帖子以弄清楚它,但由于某种原因我似乎无法理解解决方案。感觉像个新手。我相信解决方案将是显而易见的!

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

坚持不懈,终于遇到了一个 SO post,它以不同的方式接近它并且有效。 原来的 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

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

这应该有效:

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 {
          };