有没有办法优化这个在多列上搜索多个关键字的LINQ where子句?

时间:2010-05-22 10:56:54

标签: c# sql linq nhibernate

我有一个LINQ查询,可以在多个列上搜索多个关键字。目的是用户可以搜索多个关键字,并在我的Media实体中的每个属性上搜索关键字。这是一个简化的例子:

var result = repository.GetAll<Media>().Where(x =>
    x.Title.Contains("Apples") || x.Description.Contains("Apples") || x.Tags.Contains("Apples") ||
    x.Title.Contains("Oranges") || x.Description.Contains("Oranges") || x.Tags.Contains("Oranges") ||
    x.Title.Contains("Pears") || x.Description.Contains("Pears") || x.Tags.Contains("Pears")
);

换句话说,我想在ApplesOranges和{{列上搜索关键字PearsTitleDescription 1}}。

输出的SQL如下所示:

Tags

在这种情况下,这是最优化的SQL吗?如果没有,我如何重写LINQ查询以创建最佳的SQL语句?我正在使用SQLite进行测试,使用SQL Server进行实际部署。

2 个答案:

答案 0 :(得分:2)

真正的性能影响是这种查询难以优化。您希望查找子字符串,默认情况下不可索引。

从纯粹的L2S角度来看,你无能为力。但是,如果您可以启用全文搜索,那么您可以使用更好的工具来加快查询速度。

See this Stack Overflow post for more info.

答案 1 :(得分:0)

说实话,我看不出它会如何快得多。不可否认,“包含”通配符的风格开始时可能相当缓慢(例如与“开始时”相比)。

您是否看过SQL Server执行计划是什么样的?具有真实数据集的实际表现是什么?