我在企业环境中工作,我们的前端(客户端和 Web)没有直接的数据库访问权限,而是通过网络与服务通信。针对外部可用的 ASP.Net Web API 的概念验证工作已经开始,我们正在考虑尝试使用 IQueryable 的实现来使用 OData。问题是 Web API 将是另一个“前端”,它访问一个网络跳远的服务层,这意味着我们必须编写自己的 IQueryable 实现。
一个 IQueryable 实现是我所说的 RangeQueryable,它是抽象的并采用三个通用参数;TRaw,TData,TRange。这将是一个IQueryable<TData>
var queryable = new RangeQueryableImplementation<RawData, ConvertedData, DateTime>("Created");
在前面的代码行中,RawData 是 TRaw,ConvertedData 是 TData,DateTime 是 TRange。
RangeQueryable 也有两个抽象方法。
public abstract IEnumerable<TRaw> GetData(TRange from, TRange to);
public abstract TData Convert(TRaw raw);
GetData 将通过网络调用服务层,并在调用中使用from
和to
作为参数。然后 Convert 会将数据转换为我的类型。
TRaw 是服务将返回的类型,TData 是前端内的类型和 IQueryable 内的类型,TRangei 是范围类型。
所以这是可能的:
queryable.Where(d => d.Created < DateTime.Now && d.Created > DateTime.Now.AddDays(-5))
...或等效的 OData。
这就是 ExpressionVisitor 的用武之地。我需要使用 ExpressionVisitor 来查找 From 和 To 日期。
我看过一些教程并提出了一些想法。我遇到的问题是我不知道如何对 ExpressionVisitor 进行单元测试。我将如何创建一个等效于 Queryable 扩展方法创建的表达式?