2010-12-21 63 views
1

我的Silverlight應用程序(使用RIA服務)過濾我的結果時遇到了一些問題。這個想法是在客戶端上設置EntityQuery及其過濾器和調用加載。然而,這不適合我。使用Linq過濾父母的子女

繼承人我的代碼。

public void FireQuery(string filterValue) 
{ 
    EntityQuery<Parent> query = m_ParentDomainContext.GetParentQuery(); 
    query = query.Where(p => p.Children.Any(c => c.Name.Contains(filterValue))); 
    m_ParentDomainContext.Load(query, Query_Completed, null); 
} 

編譯得很好,但是,運行時我得到「查詢運算符'任何'不支持。」例外。 有誰知道一個好的方法來過濾這樣嗎?再次,我正在尋找一種方法在客戶端上進行設置。

編輯:我要指出,我已經嘗試了一些其他的查詢以及與類似的結果:

query = query.Where(p => p.Children.Where(c => c.Name.Contains(filterValue)).Count() != 0); 

query = query.Where(p => p.Children.Where(c => c.Name.Contains(filterValue)).FirstOrDefault != null); 

query = query.Where(p => p.Children.Where(c => c.Name.Contains(filterValue)).Any()); 

查詢運算符「計數/ FirstOrDefault /任何」不支持。我很明顯在這裏丟失了一些東西......

+0

我不知道很多關於RIA服務,但我認爲這是因爲沒有辦法來表示該查詢,以便它可以被髮送到服務器。也許你可以在服務器上創建查詢並將其展示給客戶端? – 2010-12-22 00:01:57

+0

雖然我可以這樣做,問題是我可能(或可能不)有我想申請的多個過濾器。如果以上工作正常,則在客戶端動態地應用過濾器將會很簡單。發送一個變量列表的過濾器到服務器?我不太確定這會順利過去。 – 2010-12-22 15:34:58

回答

1

正如我試着玩這個一點點,我想出了像First,Any和Count這樣的方法不能用於LINQ to Entities(並且我相信,甚至NHibernate)通過WCF RIA Services,因爲它們沒有在IQueryable本身上定義,但是,instread是在System.Linq命名空間中定義的擴展方法。這正是爲什麼它顯示爲運行時異常而不是編譯時錯誤。這裏可以使用的唯一擴展方法是在System.ServiceModel.DomainServices.Client(例如Where,Skip,Take,OrderBy等)中找到的那些擴展方法。

這同「EntityQuery」對象做,因爲那些需要(在你的情況,如m_ParentDomainContext.Parents)組成,併發送回服務器,而對於集合,您可以自由使用System.Linq擴展方法。

爲了實現這個功能,我建議,正如Thomas Levesque所說的,爲了只獲取你想要的數據,或者你可以使用可用的結構組合一個查詢在System.ServiceModel.DomainServices.Client中),然後在結果數據上應用其他過濾器(您可以使用System.Linq命名空間中的擴展方法)。

PS:我試着用傳統的實體框架和實體框架CodeFirst,並有相同的結果。

我希望這有助於