RIA服务查询

本文关键字:查询 服务 RIA | 更新日期: 2023-09-27 18:06:27

我可以使用一些帮助与RIA服务查询,我已经挣扎了一点现在…

Person有一个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我们可以假设所有的"include"也都在合适的位置。

这在RIA服务中是可能的吗?如果有,有人能告诉我正确的方法吗?如果没有,有没有别的办法?

我觉得这是一个简单的请求,所以希望这很容易。

谢谢提前,沙恩。

另外,有人能告诉我一个很好的在线资源,关于在客户端使用RIA服务的EntityQueries的规则吗?我很难找到这样的东西

RIA服务查询

实际上,您要做的查询是不支持的。在需要过滤集合中的数据时,不能使用ContainsAny和类似的结构。在这些场景中,您有两个选项:

  • 分别执行两个查询,然后在客户端过滤数据。这种方法存在性能问题,因为您要从服务器检索所有数据,然后将其过滤掉。在您的例子中,您可以这样做:

    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)
    
一些资源:

  • 域上下文与操作

  • 演练:添加查询方法

  • RIA服务和关系数据