【发布时间】:2015-07-06 12:20:02
【问题描述】:
我们有关系数据库(SQL Server 2014,大约 30 个表,非常规范化)。该应用程序是使用 Web.API/AngularJS 构建的
我们需要实现动态搜索——用户可以从多个实体中选择几个字段;生成的搜索伪代码可能如下所示:
SearchConditions
(
{Company.Name} <Contains> "Enterprise"
)
AND
(
{Customer.State} <Equals> "MO"
OR
{Customer.State} <Equals> "TX"
)
AND
(
{Company.AnnualSales} <LessThan> "123456.00"
)
Return
Company.Name,Customer.Name
Group By State, Company
搜索的结构将保持不变 - 由“AND”连接的一堆条件;每个条件里面可能有几个“OR”项。
我们正在使用实体框架;
到目前为止,我看到了几种实现此功能的方法:
1) 构建 SQL 查询并针对 db 运行(相当麻烦)
2) 创建 EF IQueryable 对象并使用 EF 获取数据(有点 更容易,但我担心生成的 SQL 会很糟糕)
3) 使用 Lucene.NET(它需要 Solr 服务器,我想避免使用它 如果可能)
4) 创建我们数据库的非规范化 OLAP 实例并使用方法 (1) 或 (2)
我很确定肯定还有其他方法;毕竟,EF/.NET/SQL 的组合并不是那么罕见;如果可以避免的话,我不想重新发明轮子。理想的解决方案是解析搜索字符串,进行搜索并取回必填字段(分页也是一个很好的加分项)
SSAS/SSRS 会有帮助吗?
【问题讨论】:
-
我已经通过接近 POCO 类的数据注释来做到这一点,它为我提供了用于搜索控制(反射)的字段名称,而不是基于 DapperExtensions(使用 IPredicate)构建过滤器。不过,它需要 Dapper 和 DapperExtensions(以及创建到您的数据库的 POCO 映射)。这只是一种方式,如果没有其他人出现=)
-
如果你在网页上,你可以试试this javascript solution。如果你在 WPF 上,Telerik 可以控制它,但我不记得名字了,当然它要花钱。
-
谢谢,ISBjs 的想法看起来很有前途
标签: c# sql-server entity-framework search reporting-services