查詢使用實體框架6.實體框架生成嵌套集合
假設我有兩個嵌套集合ICollection<Child>
和ICollection<Child2>
實體Parent
。我想預先抓取兩種:
dbContext.Parent.Include(p => p.Child).Include(p => Child2).ToList()
這會產生一個很大的查詢,它看起來像這樣在較高的水平:
SELECT ... FROM (
SELECT (parent columns), (child columns), NULL as (child2 columns)
FROM Parent left join Child on ...
WHERE (filter on Parent)
UNION ALL
SELECT (parent columns), NULL as (child columns), (child2 columns)
FROM Parent left join Child2 on ...
WHERE (filter on Parent)
))
有沒有辦法讓實體框架的行爲類似於批在NHibernate(或JPA,EclipseLink,Hibernate等)中獲取,你可以指定你想先查詢父表,然後分別爲每個子表查詢?
SELECT ... from Parent -- as usual
SELECT ... from Child where parent_id in (list of IDs)
SELECT ... from Child2 where parent_id in (list of IDs)
-- alternatively, you can specify EXISTS instead of IN LIST:
SELECT ... from Child where exists (select 1 from Parent where child.parent_id = parent.id and (where clause for parent))
我覺得這更容易理解和推理,因爲它更類似於你手動編寫的SQL。此外,它還可以防止結果集中多餘的父錶行。另一方面,這是更多的往返旅行。