【发布时间】:2009-11-25 23:00:41
【问题描述】:
我尝试了一些使用 LINQ 动态查询的方法 - LINQKit 和 LINQ 动态查询库。我不喜欢第二个,因为它以某种方式扼杀了 LINQ 的想法——能够在编译时检查查询。对于 LINQKit,我没有为我的场景找到一个很好的例子。我也不喜欢过度使用反射。
我的情况如下。我有一个正在执行业务逻辑和 DAL 逻辑的 Web 服务。 Webforms 应用程序是分开的。我有一些页面,其中包含用户想要过滤的每个字段的复选框,还有一个用于输入每个过滤器值的文本框。我的 Web 服务有一个 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);
那么,我如何才能将动态查询参数(以及 iPageNum 和 iPageSize)从 LINQ 获取到我的底层 DAL 实现,以便以特定于数据提供者的方式执行这些查询?也许我必须将我的 DAL 实现为一些 LINQ 数据提供者(我不知道该怎么做)?
问题是 - 我不想依赖 LINQ2SQL(然后我可以将我的存储库实现为 LINQ2SQL 的包装器),但同时我希望在 DAL 之外的任何地方都有 LINQ 查询能力。有可能吗?
【问题讨论】: