2017-10-17 115 views
1

有許多地方,它展示瞭如何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

回答

0

這工作。我也必須考慮到連接列上有空的可能性。我爲此使用了空條件運算符。不幸的是,使用內存中的數據集與使用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 
       }; 
0

試試這個

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