2017-10-20 107 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

该查询速度非常快。对我很好。谢谢!! –