2011-12-02 50 views
4

这是一个有趣的问题,我希望有人可以帮忙。RIA服务使用EF Projection的DomainService查询调用方法,并且仍然允许组合页面排序

我有以下查询的DomainService类:

[Query] 
    public IEnumerable<BatchResult> GetBatchResults(int batchId) 
    { 
     return ObjectContext.BatchQueries 
      .Include("BatchTCResults") 
      .Include("BatchANFResults") 
      .Where(x => x.BatchId == batchId) 
      .Where(x => x.BatchTCResults.Any() || x.BatchANFResults.Any()) 
      .ToArray() // enumerate because projection calls a method that EF will poop it's pants on 
      .Select(x => new BatchResult 
      { 
       BatchQueryId = x.Id, 
       Route = x.Routing, 
       Account = x.Account, 
       Amount = x.Amount, 
       CheckNumber = x.CheckNumber, 
       Severity = BatchResult.DetermineOverallSeverity(x) 
      }); 
    } 

这工作,但我真的需要分页/排序从Silverlight客户端传递的信息将被枚举在排队叫号.ToArray()

发生之前应用

客户端正在使用DomainDataSource Silverlight控件。

我该如何做到这一点?

回答

3

最简单的方法是将方法参数列表中的分页/排序/过滤参数添加到服务方法中的数据上下文查询中并添加相应的LINQ查询操作符。但是,在这种情况下,您将失去客户端IQueryable的功能。我的意思是,客户端的查询只会到达应用程序服务器,但不会到达数据库。你需要在DomainContext和UI之间有一层:DomainDataSource不太可能工作。

将查询结果公开为IQueryable使用AsQueryable()不会有帮助,因为表达式树将无条件编译到代码中以执行您的LINQ到对象运算符。

有点困难的选择是在第一种情况下使用参数,并在客户端查询对象上编写自己的IQueryable包装。这个包装器将从查询表达式中提取参数并将它们作为方法参数传递给服务。那么,如果我有足够的业余时间,我只会尝试这个。

另一个困难的方法是做类似的事情服务器端。有可能获得一个IQueryable对象,该对象的表达式树从客户端传递到DomainService。您需要覆盖DomainService.Query方法。然后,您将能够提取与分页/排序相关的部分查询表达式,将其保存到字段中,然后应用于数据库查询。但是,对于给定的DomainService中的所有方法,Query方法是单一的。因此,您可能会以一个大表方法结束,这个方法决定了每个服务查询方法的做法。不用说,服务将变得非常困难。

最后,我强烈建议您选择第一个选项。

+0

我很害怕这个。 –

相关问题