2010-03-03 89 views
2

我需要施放:IQueryable<PARENT>IQueryable<Child>IQueryable親子

IQueryable<PARENT> query = GetParents(); 

IQueryable<CHILD> result = query.Select(t => t.Children); 

這不起作用,無法將EntitySet轉換爲IQueryable。由於

+1

這意味着您可以將'Parent'強制轉換爲'Child',即該Parent從子代繼承,或者兩者都實現相同的接口,但與IQueryable 相矛盾。 – AxelEckenberger 2010-03-03 23:18:05

+0

是的,他們有一個數據庫中的實體集關聯,所以孩子從父母繼承。您的方法有效,但出於某種原因會創建一些重複項。 – Victor 2010-03-03 23:22:31

+0

修改我的答案。但是,他所描述的關係是1:n的關係。即父母有多個孩子,每個孩子有一個父母。繼承是不同的!它描述了一種類型關係船,例如,黃瓜是蔬菜類型。當你得到重複的時候,它意味着(如果是1:n)關係,你的子表中有多個具有相同值的條目。 – AxelEckenberger 2010-03-04 10:37:56

回答

0

用途:

IQueryable<CHILD> result = query.SelectMany(t => t.Children); 

查詢返回父的所有cild項目,童車被多個家長引用將返回多次。

要獲得不同的行使用 - 你將不得不實現一個實現了IComparer,雖然,做一個自定義過濾。 Distinct()將查看實例而不是值。

IQueryable<CHILD> result = query.SelectMany(t => t.Children) 
           .Distict(new Comparer<CHILD>()); 

Distinct()刪除查詢中的重複項。

Aternatively你可以用分組創建分組爲孩子:

IEnumerable<CHILD> result = query.SelectMany(t => t.Children) 
           .GroupBy(x => new CHILD { 
             id = x.id 
             // add other properties here 
           }) 
           .Select(g => g.Key); 

相反new CHILD { }的,你也可以使用new { }創建一個匿名的結果,在這種情況下,你應該var取代IEnumerable<CHILD>

要執行Linq中的一個類型轉換,你可以使用 - 雖然我認爲這不會在你的情況下工作:

someQuery.OfType<TypeToCastTo>().Cast<TypeToCastTo>(); 

OfType<T>()過濾項目,以便Cast<T>()可以進行類型轉換。

+0

謝謝你的回覆。 – Victor 2010-03-04 19:06:24