获取父记录内外所有行的高效方法

时间:2017-10-20 13:17:24

标签: sql-server linq linq-to-sql

假设我有以下数据库结构: database structure

我想获取 Page 的所有记录。

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,但由于这些是大表不能正常工作。所以我正在寻找一个单一查询解决方案,我可以在选择行后进行过滤。

你们怎么会接近这个?

1 个答案:

答案 0 :(得分:1)

我的经验是,最好通过最后要返回的项目启动LINQ查询,然后添加所需的谓词:

var result = context.Lines ...

您想要属于特定Page的行 - 让我们说您有一个pageId变量。这些行可以直接通过Page s ...

属于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谓词,并且根据查询的性质,不会返回重复项。