我想获取 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,但由于这些是大表不能正常工作。所以我正在寻找一个单一查询解决方案,我可以在选择行后进行过滤。
你们怎么会接近这个?
答案 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,Paragraph
和PageItem
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
谓词,并且根据查询的性质,不会返回重复项。