【问题标题】:LINQ to DataSet multi-table left joinLINQ to DataSet 多表左连接
【发布时间】: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 可以很好地处理它们。如果关系正确,则不需要那么多连接。

标签: c# linq join


【解决方案1】:

这行得通。我还必须考虑连接列上出现空值的可能性。为此,我使用了空条件运算符。不幸的是,使用内存数据集与使用 SQL Server 一样慢(而且我什至没有所有连接或所有 where 子句测试到位)。看来我需要使用不同的方法。

var results = from e in _data.ds.Employee
              join es in _data.ds.EmployeeSkill on e.EmployeeId equals es.EmployeeId        into esGroup from esItem in esGroup.DefaultIfEmpty()
              join s in _data.ds.Skill on esItem?.SkillId equals s.SkillId                  into sGroup from skillItem in sGroup.DefaultIfEmpty()
              join er in _data.ds.EmployeeRole on e.EmployeeId equals er.EmployeeId         into erGroup from erItem in erGroup.DefaultIfEmpty()
              join r in _data.ds.Role on erItem?.RoleId equals r.RoleId                     into rGroup from rItem in rGroup.DefaultIfEmpty()
              join et in _data.ds.EmployeeTechnology on e.EmployeeId equals et.EmployeeId   into etGroup from etItem in etGroup.DefaultIfEmpty()
              join t in _data.ds.Technology on etItem?.TechnologyId equals t.TechnologyId   into tGroup from tItem in etGroup.DefaultIfEmpty()
              where
                e.FirstName.IndexOf(searchTerm, StringComparison.OrdinalIgnoreCase) >= 0 ||
                e.LastName.IndexOf(searchTerm, StringComparison.OrdinalIgnoreCase) >= 0 ||
                e.RMMarket.IndexOf(searchTerm, StringComparison.OrdinalIgnoreCase) >= 0 ||
                !e.IsSummaryNull() && e.Summary.IndexOf(searchTerm, StringComparison.OrdinalIgnoreCase) >= 0
              select new SearchResult
              {
                  EmployeeId = e.EmployeeId,
                  Name = e.FirstName + " " + e.LastName,
                  Title = e.Title,
                  ImageUrl = e.IsImageUrlNull() ? string.Empty : e.ImageUrl,
                  Market = e.RMMarket,
                  Group = e.Group,
                  Summary = e.IsSummaryNull() ? string.Empty : e.Summary.Substring(1, e.Summary.Length < summaryLength ? e.Summary.Length - 1 : summaryLength),
                  AdUserName = e.AdUserName
              };

【讨论】:

    【解决方案2】:

    试试这个

    var results = DataSetHelper.ds.Employee
    .Join(DataSetHelper.ds.EmployeeSkill, e => e.EmployeeId, es => es.EmployeeId, (e, es) => new { e, es })
    .Join(DataSetHelper.ds.Skill, esGroup  => esGroup.es.SkillId, s => s.SkillId, (esGroup, s) => new { esGroup.e, esGroup.es, s })
    .Join(....
    

    我已经展示了直到第一个多对多关系。一切都会有点长,但我希望你能处理好。

    【讨论】:

    • 可以用查询语法来完成吗?我有很多其他代码(大 where 子句等),并且希望保留该语法。
    • 好的。我尝试添加一些 where (.Where(e.FirstName...) 子句和选择。我得到“e 在当前上下文中不存在。”
    猜你喜欢
    • 2013-06-13
    • 1970-01-01
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    • 1970-01-01
    相关资源
    最近更新 更多