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 {
};
在此先感谢您的帮助。 无论如何都不是 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 {
};