2011-08-23 136 views
1

我可以用RIA服務查詢的一些幫助,我現在一直在努力...RIA服務查詢

人有一個DailyScore的集合。

我希望能夠產生一個在Person和DailyScore上都被過濾的查詢。

DateTime start = ... 
DateTime end = ... 

var personQuery = context.GetPersonQuery().Skip.(10).Take(10) 
var scoresQuery = from s in ctx.GetDailyScoresForPeriod(start, end) 
         where personQuery.Contains(s.Person) 
         select s; 

...load the scoresQuery 

我會最好要加載指定的相應DailyScores period.n我們可以假定所有的「包括」到位太Person對象。

RIA Services可能嗎?如果是這樣,有人可以給我正確的方式去解決它,如果不是有任何解決辦法?

我覺得這是一個簡單的請求,所以希望這很容易。

謝謝提前, Shane。

另外,有人可以指點我一個關於在RIA服務的客戶端使用EntityQueries的規則的良好在線資源嗎?我一直在努力尋找這樣的事情。

回答

3

實際上,您正在嘗試執行的查詢不受支持。您不能使用Contains,Any以及需要過濾集合中數據的類似構造。 在這些情況下,你有兩個選擇:

  • 分別執行這兩個查詢,然後篩選客戶端上的數據。此方法存在性能問題,因爲您正在從服務器檢索所有數據,然後將其過濾出來。在你的情況下,你會這樣:

    var personQuery = context.GetPersonQuery().Skip.(10).Take(10); 
    var scoresQuery = context.GetDailyScoresForPeriodQuery(start, end); 
    
    // Load both queries and then: 
    scores.Where(s => persons.Contains(s.Person)) 
    
  • 在服務器中執行查詢。這種方法更高效,但您需要定義一種方法來篩選同一查詢中的人員。在你的情況,如果你只是想其ID的下降在一定範圍內,例如人員,你應該將這個方法添加到(服務器)域範圍內:

    IQueryable<DailyScore> GetDailyScoresForPeriodForPersons(DateTime start, DateTime end, int firstPerson, int lastPerson) 
    { 
        return context 
         .DailyScores 
         .Where(s => s.Start > start && s.End < end) 
         .Where(s => s.Person.ID >= firstPerson && s.Person.ID < lastPerson) 
    } 
    
    在客戶端

    然後,你會打電話它是這樣的:

    var scoresQuery = context.GetDailyScoresForPeriodForPersons(start, end, 10, 20) 
    

一些資源:

+0

嗯,令人失望的是RIA服務不能像這樣的演出,但我想我只需要在系統的限制範圍內工作。非常感謝您的幫助。 – Shane