我使用两种不同的方法来实现高级搜索,其中每种方法都有其优点和缺点。
用户可以使用3个参数(姓名,姓氏和移动设备)执行高级搜索。
我尝试的第一种方法是检查用户提供了哪些参数;这要求我做8 if
& else
检查(2 ^个参数)并在每个条件中我写一个单独的查询,该查询接受相应的参数,例如,如果用户输入了名称&系列名称查询的where子句如下所示:
where(x=>x.name.contains(name) && x.familyname.contains(familyname))
或者在另一种情况下,如果用户只输入了移动设备,则查询的where子句将如下所示:
where(x=>x.mobile==mobile)
这种方式的优点是我一次点击了数据库,但缺点是我必须编写更多的代码。
我尝试的第二种方式是我声明了一个IQueryable<>
对象并且我首先将数据提供给It,然后我逐个检查搜索参数,如果其中任何一个有值,我会过滤{ {1}}使用该值,最后我执行IQueryable
。这种方式的优点是代码少得多,但两次访问数据库是一个问题。
以下是第二种方式的代码示例:
.ToList()
我想知道是否有更好的方法或最佳做法来使用entityframework执行高级搜索?
答案 0 :(得分:7)
您使用第二个解决方案 多次多次访问数据库。请记住,IQueryable
对象是一个查询本身,而不是查询的结果。延迟执行直到实际迭代查询。根据各种Where
检查有条件地附加多个if
子句正在更改查询本身,而不是处理查询结果(因为在该时间点没有结果)。
您可以在数据库上使用分析器来验证是否只执行了一个查询,并且一个查询包含该分析中的所有过滤。
这是一种相当普遍的模式;我已在许多实例中使用它来制作自定义搜索页面。