拦截 LINQ to SQL 结果

Intercepting LINQ to SQL results

我正在尝试从发送到 DataContext (Devart.Data.Linq) 的 linq 表达式中捕获查询结果。我可以使用 Log 属性 来记录查询,但还没有找到拦截 IQueryable 结果的方法。

目的是将查询和结果配对在一起,将它们序列化,然后在测试套件中使用它们模拟数据上下文。

所有看起来很有前途的 Devart.Data.Linq.DataContext 方法(ExecuteQuery、Query)都是非虚拟的,因此我无法覆盖它们来存储结果。我不想在编写 linq 查询时记录结果,因为它会非常混乱并且意味着在整个应用程序中粘贴测试相关代码。

我最终找到了一种通过包装 DataContext 和包含的 IQueryable 来拦截查询和结果的迂回方式。这需要实现自定义 IQueryable 和 IQueryProvider。 https://blogs.msdn.microsoft.com/alexj/2010/03/01/tip-55-how-to-extend-an-iqueryable-by-wrapping-it/ 给出了一个很好的例子 一旦完成,就可以在覆盖的 IQueryProvider.Execute 方法中捕获查询结果。捕获 ORM 生成的关联 SQL 需要跟踪 DataContext.Log 属性 以了解执行查询前后的更改。