簡體   English   中英

Linq to Sql 多個外連接

[英]Linq to Sql multiple outer joins

在此先感謝您的幫助。 無論如何都不是 Linq to Sql 的專家。 我有4張桌子。

毫不奇怪,主 lb_item 表定義了一個項目。 許多字段但包含 3 個 ID 字段。 itemID (key) categoryID (not null) patternID (可以為null)

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'失敗的異常。這可能表明EF Core中存在錯誤或限制”。

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

我花了最后一個小時查看各種 SO 帖子以解決問題,但由於某種原因,我似乎無法理解解決方案。 感覺像個新手。 我相信解決方案將是顯而易見的!

任何幫助或指向解決方案的指針將不勝感激。

堅持不懈,終於遇到了一個 SO 帖子,該帖子以不同的方式接近它並且它起作用了。 原始 SO 在這里

我的工作代碼現在是這樣的:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM