我尝试了一些使用 LINQ 动态查询的方法 - LINQKit 和 LINQ 动态查询库。我不喜欢第二个,因为它在某种程度上扼杀了 LINQ 的想法——能够在编译时检查查询。对于 LINQKit,我没有找到适合我的场景的好例子。我也不喜欢过度使用反射。
我的场景如下。我有一个执行业务逻辑和 DAL 逻辑的 Web 服务。 Webforms 应用程序是分离的。我有一些页面,其中包含用户想要过滤的每个字段的复选框,还有一个用于输入每个过滤器值的文本框。我的网络服务有一个 GetByFilter 方法,我在其中传递一些列表。 QueryObject 是一个带有字符串:filedName,对象:fieldValue 的类。
然后我的 Web 服务接收查询对象列表,现在出现一个大问题:如果字段计数和过滤器值可能有所不同,如何将其转换为 LINQ 查询?
更糟糕的是 - 我不使用 LINQ2SQL,但我使用一些带有存储库的自定义 DAL,如果需要,这些存储库可能会返回 IQuery(如下所示: http://msdn.microsoft.com/en-us/magazine/dd569757.aspx 滚动到存储库)。
我知道我可以使用 LINQ2SQL 进行分页: var PagedData = query.Skip((iPageNum - 1) * iPageSize).Take(iPageSize);
那么我如何才能从 LINQ 获取动态查询参数(以及 iPageNum 和 iPageSize)到我的底层 DAL 实现,以便以数据提供者特定的方式执行这些查询?也许我必须将我的 DAL 实现为某些 LINQ 数据提供程序(我不知道该怎么做)?
问题是 - 我不想依赖 LINQ2SQL(那么我可以将我的存储库实现为 LINQ2SQL 的包装器),但同时我希望在 DAL 之外的任何地方都具有 LINQ 查询功能。可以吗?
这当然是可能的,您想要创建自己的 IQueryable,一个“自定义 LINQ 提供程序”
这是 MSDN 文章:http://msdn.microsoft.com/en-us/library/bb546158.aspx Matt Warren 对此有一个博客系列:http://blogs.msdn.com/mattwar/archive/2007/07/30/linq-building-an-iqueryable-provider-part-i.aspx
我建议你开始尝试一下,看看它有多难,以及它对你来说是否值得!
如果您决定反对,请阅读此博客文章:http://www.hanselman.com/blog/RealWorldAppsInDaysNotWeeks.aspx 看看 ADO.Net 数据服务 (Astoria) 对您是否有用