【问题标题】:RIA Services QueryRIA 服务查询
【发布时间】:2011-08-23 10:18:07
【问题描述】:

对于我一直在努力解决的 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

理想情况下,我想要的是在指定时间段内加载了适当的 DailyScores 的 Person 对象。n 我们可以假设所有“包含”也都已到位。

这在 RIA 服务中是否可行?如果是这样,有人可以给我正确的方法吗?如果没有,有什么解决方法吗?

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

谢谢提前, 肖恩。

另外,有人可以向我指出一个关于在客户端使用具有 RIA 服务的 EntityQueries 的规则的在线资源吗?我一直在努力寻找这样的东西。

【问题讨论】:

    标签: c# silverlight wcf-ria-services


    【解决方案1】:

    实际上,不支持您尝试执行的查询。您不能在需要过滤集合中的数据的地方使用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 服务不能像这样执行,但我想我只需要在系统的限制范围内工作。非常感谢您的帮助。
    猜你喜欢
    • 2011-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多