问题陈述
假设我有一个查询,用于搜索人名:
var result = (from person in container.people select person)
.Where(p => p.Name.Contains(some_criterion)
这将被翻译为一个包含以下like子句的SQL查询:
WHERE NAME LIKE '%some_criterion%'
这会对性能产生一些影响,因为数据库无法有效地使用名称列上的索引(如果我没有记错的话,索引扫描与索引搜索相对应)。
为了解决这个问题,我可以决定仅使用StartsWith(),生成一个带有like子句的查询,如下:
WHERE NAME LIKE 'some_criterion%'
这允许SQL服务器使用索引查找并在一些功能的代价下实现更好的性能。
我希望能够为用户提供选择:将行为设定为使用StartsWith作为默认值,但如果用户想要使用Contains()进行搜索并获得“增加的灵活性”,则应该使用它。
我已经尝试过什么
我认为这很简单,就去实现了一个string的扩展方法。但是,LINQ不接受此方法,并会引发异常。
当然,现在我可以使用if或switch语句并为每种情况创建一个查询,但我更愿意“在更高级别”或更通用地解决这个问题。简而言之:由于实际应用程序的复杂性,使用if语句区分用例是不可行的。这将导致很多重复和混乱。我真的很想能够以某种方式封装各种行为(Contains、StartsWith、EndsWith)。
问题
我应该在哪里寻找或者应该寻找什么?这是否需要通过IQueryables进行组合?我很困惑!