Запрос служб 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

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

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

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

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

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


person Shane    schedule 23.08.2011    source источник


Ответы (1)


Фактически, запрос, который вы пытаетесь выполнить, не поддерживается. Вы не можете использовать 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)
    

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

person alf    schedule 23.08.2011
comment
Хм, разочарование, что службы RIA не могут работать так, но я полагаю, что мне просто нужно работать в рамках ограничений системы. Большое спасибо за вашу помощь. - person Shane; 23.08.2011