2011-03-16 57 views
1

我怎麼做的父子關係的渴望查詢:LINQ查詢 - 排序和過濾的渴望如何獲取

  1. 過濾器兒童領域
  2. 各種各樣雙方父母和孩子
  3. 返回列表或父母與孩子預填充

如果我嘗試

from p in _context.Parents.Include("children") 
join c in _context.childrenon p.Id equals c.ParentId 
where d.DeletedDate == null 
orderby p.Name ascending, c.Name 
select p 

然後我得到的父對象回來,但每個家長都有NULL兒童

,如果我嘗試

from p in _context.Parents.Include("children") 
orderby p.Name ascending 
select p 

查詢返回所有的父母和孩子,但他們不過濾或排序。

,我想回去的結果是IEnumerable<Parent>

Parent[0].name = "foo" 
Parent[0].children = IEnumerable<Child> 
Parent[1].name = "bar" 
Parent[1].children = IEnumerable<Child> 
+0

我想每個家長可能爲零或更多的孩子。父母有多個孩子時,預期的產出是多少? – tvanfosson 2011-03-16 12:12:38

+0

@tvanfosson我已更新我的問題與此信息 – Daveo 2011-03-16 12:18:06

回答

1

的解決方案取決於正是你正在嘗試做的。

第一個查詢讓你想「變平」的結果中的對象的印象,這樣的(僞代碼,我希望這是清楚明白我的意思):

{ Parent1, Child1 } 
{ Parent1, Child2 } 
{ Parent1, Child3 } 
{ Parent2, Child1 } 

在這種情況下,每個結果「行「將是具有ParentChild屬性的對象,您可以按父級名稱,然後按子級名稱進行排序。

第二個查詢只是返回Parent對象和(您不顯示它,但我假設EF已被指示要這樣做),每個對象都有一個Children集合。在這種情況下,您只能按父母名稱排序;如果您想對每個Parent的孩子進行排序,請單獨對該對象上的Children集合進行排序。

你想要做哪兩項?

更新

OK,看來你想要第二個。我不相信它可以直接完成。你可以做它時,你列舉的結果 - 因爲Parent s的已經排序,只是每個人的兒童進行排序:

var sortedChildren = parent.Children.OrderBy(c => c.Name); 
+0

我寧願第二個選項。我的最終目標是與optGroup標記分組的選擇框 – Daveo 2011-03-16 12:21:54

+0

如果我錯了,請糾正我,但您是否建議從數據庫中提取父項,然後在內存中進行排序? – Yakimych 2011-03-16 12:36:40

+0

我得到它與選擇所有數據,然後在內存中排序工作。是的,這可能不是最有效的,但我的數據集只是很小,它很容易編碼p.Chilren.Where(x => x.DeletedDate == null).OrderBy(x => x.Name);在每個父母的循環中 – Daveo 2011-03-16 12:45:06

8

有這樣做的沒有直接的方法,但你可以用一種變通方法某種程度上是 - 將父項和子項投影到一個匿名對象上,然後從對象中選擇並返回父項。

見類似的問題:Linq To Entities - how to filter on child entities

你的情況,你將不得不沿着線的東西:

var resultObjectList = _context. 
         Parents. 
         Where(p => p.DeletedDate == null). 
         OrderBy(p => p.Name). 
         Select(p => new 
           { 
            ParentItem = p, 
            ChildItems = p.Children.OrderBy(c => c.Name) 
           }).ToList(); 

List<Parent> resultingCollection = resultObjectList.Select(o => o.ParentItem).ToList(); 
+2

我現在正在嘗試這種方式,當它產生正確的SQL但結果集合沒有填充子項目。無論如何,CAST從匿名類型返回到帶有子列表的父對象?或者我應該只是創建一個與匿名類型(我使用mvc .net)匹配的新View模型 – Daveo 2011-03-18 06:48:06

0

預取子領域:

using (BlogDataContext context = new BlogDataContext()) 
{ 
    DataLoadOptions options = new DataLoadOptions(); 
    options.LoadWith<Blog>(c => c.Categories); 
    options.LoadWith<Blog>(c => c.Title); 
    context.LoadOptions = options; 
    Blog blog = context.Blogs.Single<Blog>(c => c.BlogId == 1); 
} 
+0

我認爲LoadOptions僅適用於DataContext,而不適用於Entity.DbContext – Daveo 2011-03-16 12:42:44