我尝试过一些使用LINQ动态查询的方法 - LINQKit和 LINQ动态查询库。我不喜欢第二种,因为它以某种方式杀死了LINQ的想法 - 能够在编译时检查查询。使用LINQKit我没有找到适合我的场景的好例子。我也不喜欢过度使用反射。
我的方案如下。我有一个Web服务,它正在做业务逻辑和DAL逻辑。 webforms应用程序是分开的。我有一些页面包含用户想要过滤的每个字段的复选框,还有一个文本框用于输入每个过滤器值。我的Web服务有一个方法GetByFilter,我传递一些List。 QueryObject是一个包含字符串的类:filedName,object:fieldValue。
然后我的webservice收到查询对象列表,现在提出了一个大问题:如果字段计数和过滤器值可能会有所不同,如何将其转换为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查询功能。有可能吗?
答案 0 :(得分:0)
这当然是可能的,您所期待的是创建自己的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)是否对您有用