RIA Services Query - PullRequest
       3

RIA Services Query

1 голос
/ 23 августа 2011

Я мог бы использовать некоторую помощь в запросе сервисов 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

В идеале мне бы хотелось, чтобы объекты Person загружались с соответствующими DailyScores за указанный период. N Можно предположить, что все «включения» также находятся на месте.

Возможно ли это в RIA Services? Если да, то может ли кто-нибудь дать мне правильный путь, и если нет, то есть ли какие-то обходные пути?

Мне кажется, что это простая просьба, так что, надеюсь, это легко.

Спасибо, заранее, Шейн.

Кроме того, может ли кто-нибудь указать мне хороший онлайн-ресурс о правилах использования EntityQueries на стороне клиента с RIA Services? Я изо всех сил пытался найти что-нибудь подобное.

1 Ответ

3 голосов
/ 23 августа 2011

На самом деле запрос, который вы пытаетесь сделать, не поддерживается. Вы не можете использовать 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))
    
  • Выполнить запрос на сервере. Этот подход более эффективен, но вам нужно определить способ фильтрации лиц в одном запросе. В вашем случае, если вы хотите, чтобы люди, чьи идентификаторы попадали, например, в определенный диапазон, добавьте этот метод в контекст вашего домена (на сервере):

    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)
    

Некоторые ресурсы:

...