gpt4 book ai didi

asp.net - 使用 EF Projection 进行 RIA 服务 DomainService 查询,调用方法并仍然允许组合分页/排序

转载 作者:行者123 更新时间:2023-12-02 16:34:19 25 4
gpt4 key购买 nike

这是一个有趣的问题,我希望有人能帮忙解决。

我有一个包含以下查询的 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)
});
}

这可行,但我确实需要在调用 .ToArray() 的行中进行枚举之前应用从 Silverlight 客户端传递的分页/排序信息

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

我怎样才能实现这个目标?

最佳答案

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

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

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

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

总而言之,我强烈推荐您第一个选项。

关于asp.net - 使用 EF Projection 进行 RIA 服务 DomainService 查询,调用方法并仍然允许组合分页/排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8358681/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com