2017-10-20 170 views
1

所有行性能方法說我將具有以下數據庫結構: database structure獲取內外父記錄

,我想從線是在得到所有的記錄。

PageItems表包含無論是LineId值或每個記錄ParagraphId值。

 
Id Title 
----------- 
1 My page 

PageItems

 
PageId LineId ParagraphId 
------------------------- 
1  1  NULL 
1  2  NULL 
1  NULL 1 

段落

 
Id 
-- 
1 

ParagraphItems

 
ParagraphId LineId 
------------------ 
1   3 
1   4 

 
Id Content 
------------------ 
1 Loose line 1 
2 Loose line 2 
3 Paragraph line 1 
4 Paragraph line 2 

我首先想到的是使用UNION,但由於這些都是不會很好地工作大表。所以我正在尋找一個單一查詢解決方案,我可以在選擇行後進行篩選。

你們會怎麼做?

+0

如果一個PageItem鏈接到該ID並且另一個PageItem通過段落間接鏈接到它,是不是有可能得到重複的行?你想要那些重複? –

+0

@TimSchmelter重複是沒有問題的,我可以稍後過濾掉。 –

+0

@GertArnold,所有的表都有適當的外鍵,所以導航屬性正是你期望它們的位置。是L2S不是EF。 –

回答

1

我的經驗是,它最好的,你到底想返回,然後添加所需的謂詞的項目開始LINQ查詢:

var result = context.Lines ... 

你想要一個屬於特定Page線 - - 假設你有一個pageId變量。該行可以屬於Page直接通過PageItem小號...

var result = context.Lines 
        .Where(l => l.PageItems.Any(pi => pi.PageId == pageId)) ... 

...或通過ParagraphItem S,ParagraphPageItem S:

var result = context.Lines 
        .Where(l => l.PageItems.Any(pi => pi.PageId == pageId) 
          || l.ParagraphItems.Any(pa => pa.Paragraph.PageItems 
            .Any(pi1 => pi1.PageId == pageId))); 

這將轉化爲高效Exist謂詞和根據查詢的性質,不會返回重複項。

+0

該查詢速度非常快。對我很好。謝謝!! –