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的规则吗?我很难找到这样的东西
实际上,您要做的查询是不支持的。在需要过滤集合中的数据时,不能使用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))
-
在服务器端执行查询。这种方法性能更高,但是您需要定义一种方法来过滤同一查询中的人员。在您的情况下,如果您只需要其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服务和关系数据