【发布时间】:2017-10-17 14:24:19
【问题描述】:
有很多地方展示了如何使用 LINQ 左连接两个表,但我无法在连接中添加更多数据(我有 15 个表)。我以为我把模式弄坏了,但我得到了一个错误。顺便说一句,这是针对强类型数据集的,尽管我不怀疑这很重要。虽然我实际上有更多的表要添加到联接中,但我试图让它在最初使用更少的联接时工作(星号是发生错误的地方):
var results =
from e in DataSetHelper.ds.Employee
join es in DataSetHelper.ds.EmployeeSkill on e.EmployeeId equals es.EmployeeId into esGroup from esItem in esGroup.DefaultIfEmpty()
join s in DataSetHelper.ds.Skill on **es.SkillId** equals s.SkillId into skillGroup from skillItem in skillGroup.DefaultIfEmpty()
join er in DataSetHelper.ds.EmployeeRole on e.EmployeeId equals er.EmployeeId into erGroup from erItem in erGroup.DefaultIfEmpty()
join r in DataSetHelper.ds.Role on **er.RoleId** equals r.RoleId into rGroup from rItem in rGroup.DefaultIfEmpty()
我遇到了两个错误(同样的事情,但在不同的连接上)。它们位于查询的第 3 行和第 5 行。
对于es.SkillId,,错误是The name 'es' does not exist in the current context.
对于er.RoleId,,错误是The name 'er' does not exist in the current context.
再次,我需要将此模式用于另外十个连接,因此我希望该模式不会随着我的使用而增加复杂性。
【问题讨论】:
-
您的数据集是否有多个表。许多情况下,数据集只有一个表。您需要加入一个表,因此请使用 ds.Table[0] 或 ds.Table["Name"]
-
这是一个复杂的查询。你确定你的数据库是规范化的吗?
-
@AnupSharma 规范化正是您在查询中加入的原因。这个数据库实际上没有我设计它时的规范化程度。随着进一步规范化,将会有更多的连接。
-
@jdweng 数据库中大约有 15 个表。请记住,我使用的是强类型数据集,因此引用您显示的表格是不正确的。
-
我没有您的应用程序的上下文,但通常情况下,您在数据库中有关系,EF 可以很好地处理它们。如果关系正确,则不需要那么多连接。