2017-10-17 11 views
1

LINQを使用して2つのテーブルをLEFT結合する方法が示されている場所はたくさんありますが、結合を追加する際に問題があります(15個のテーブルがあります)。私はパターンがダウンしていると思ったが、私はエラーが発生している。ところで、これは厳密に型指定されたDataSetに反対していますが、私はそれが問題ではないと考えています。LINQ to 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() 

私は(2つのエラーを取得しています:私は実際に参加するに追加するには多くの複数のテーブルを持っていますが、私はそれが少ない(エラーがoccuringしているところアスタリスクがある)加入すると最初に作業を取得しようとしています同じことですが、別の結合で)。それらはクエリの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.

です、私が参加し、他の10のために、このパターンを使用する必要がありますので、私はパターンが増加しない願っています私が行くほど複雑になります。

+0

あなたは複数のテーブルを持っていますか?多くの場合、データセットにはテーブルが1つしかありません。 ds.Table [0]またはds.Table ["Name"] – jdweng

+0

これは複雑なクエリの1つです。データベースが正規化されていますか? –

+0

@AnupSharma正規化は、クエリに結合された理由です。このデータベースは実際に私が設計したよりも正規化されていません。さらに正規化すれば、さらに多くの結合が存在します。 – birdus

答えて

0

これは機能します。私はまた、結合列にnullの可能性を考慮する必要がありました。私はそのためにヌル条件付き演算子を使用しました。残念ながら、メモリ内のデータセットを使用することは、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 ...)節とselectを追加しようとしました。私は "現在のコンテキストにeが存在しない"ことを知っています。 – birdus

関連する問題