LINQ到DataSet中的多台左加入

问题描述:

有许多地方,它展示了如何LEFT JOIN使用LINQ两个表,但我无法增加更多的进入连接(我有15桌)。我以为我有这种模式,但我得到一个错误。顺便说一句,这是针对强类型的数据集,尽管我不怀疑这一点。虽然我其实有更多的表添加到一起,我试图把它用更少的加入最初的工作(星号是其中的误差存在的):LINQ到DataSet中的多台左加入

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.

同样,我需要为另外十个加入到使用这种模式,所以我希望的格局不会增加随着我走向复杂。

+0

你是否有集多个表。许多情况下,数据集将只有一个表。你需要加入一个表,所以请使用ds.Table [0]或ds.Table [“名称”] – jdweng

+0

这是一个复杂的查询。你确定你的数据库是正常化的吗? –

+0

@AnupSharma标准化正是您加入查询的原因。这个数据库实际上比我设计的数据库要少得多。随着进一步的正常化,将会有更多的连接。 – birdus

这工作。我也必须考虑到连接列上有空的可能性。我为此使用了空条件运算符。不幸的是,使用内存中的数据集与使用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 
       }; 

试试这个

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(.... 

我已经表明,直到第一个多对多的关系。对于一切都会有点长,但我希望你能管理它。

+0

这可以用查询语法来完成吗?我有很多其他代码(大where子句等),并希望保持这种语法。 – birdus

+0

好的。我尝试添加一些我在哪里(.Where(e.FirstName ...)子句和选择。我得到“e在当前环境中不存在”。 – birdus