2011-08-23 2 views
1

je pouvais utiliser un peu d'aide avec un service de RIA requête que je me bats avec un peu maintenant ...RIA Services Interrogation

Person a une collection de DailyScore.

Je souhaite être en mesure de produire une requête filtrée à la fois sur Person et 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 

Ce que je veux est idéalement les objets personne chargés avec les DailyScores appropriées pour spécifié period.n On peut supposer tous les « comprend » sont en place aussi.

Est-ce possible dans les services RIA? Si oui, quelqu'un peut-il me donner la bonne façon de procéder, et s'il n'y a pas de solution de rechange? Je me sens comme c'est une demande simple, donc j'espère que c'est facile.

Merci d'avance, Shane.

En outre, quelqu'un peut-il me diriger vers une bonne ressource en ligne sur les règles entourant l'utilisation d'EntityQueries côté client avec RIA Services? J'ai lutté pour trouver quelque chose comme ça.

Répondre

3

En fait, la requête que vous essayez de faire n'est pas supportée. Vous ne pouvez pas utiliser Contains, Any et des constructions similaires dans lesquelles vous devez filtrer des données dans une collection. Dans ces scénarios, vous avez deux options:

  • requêtes séparément exécuter les deux, puis filtrer les données sur le client. Cette approche présente des problèmes de performances, car vous récupérez toutes les données du serveur, puis filtrez-les. Dans votre cas, vous quelque chose comme ceci:

    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)) 
    
  • Réalise la requête dans le serveur. Cette approche est plus performante, mais vous devez définir un moyen de filtrer les personnes dans la même requête. Dans votre cas, si vous ne voulez que les personnes dont les ids tombent dans une plage spécifique, par exemple, vous devez ajouter cette méthode à votre contexte de domaine (sur le serveur):

    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) 
    } 
    

    Ensuite, dans votre client, vous appelleriez comme ceci:

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

Quelques ressources:

+0

Hmm, décevant que les services RIA ne peuvent pas effectuer comme ça, mais je suppose que je dois juste travailler dans les limites du système. Merci beaucoup pour votre aide. – Shane