加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net – 使用EF Projection的RIA Services DomainService查询

发布时间:2020-12-16 09:50:15 所属栏目:asp.Net 来源:网络整理
导读:这是一个有趣的问题,我希望有人可以伸出援助之手. 我有一个DomainService类,其中包含以下查询: [Query] public IEnumerableBatchResult GetBatchResults(int batchId) { return ObjectContext.BatchQueries .Include("BatchTCResults") .Include("BatchANFR
这是一个有趣的问题,我希望有人可以伸出援助之手.

我有一个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控件.

我怎样才能做到这一点?

解决方法

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

使用AsQueryable()将查询结果公开为IQueryable将无济于事,因为表达式树将无条件地编译为代码以执行LINQ-to-Objects运算符.

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读