First, I'm adding words entered into a search field to an array. Then, I'm getting results from a stored procedure on SQL Server using Database First approach with Entity Framework.
Finally, for each word in the array, I'm filtering the results using this query:
products = products.Where(item => (item.basedescription.ToLower().StartsWith(searchWords[x] + " ")
|| item.basedescription.ToLower().StartsWith(service.Pluralize(searchWords[x]) + " ")
|| item.basedescription.ToLower().StartsWith(service.Singularize(searchWords[x]) + " ")
|| item.basedescription.ToLower().EndsWith(" " + searchWords[x])
|| item.basedescription.ToLower().EndsWith(" " + service.Pluralize(searchWords[x]))
|| item.basedescription.ToLower().EndsWith(" " + service.Singularize(searchWords[x]))
|| item.basedescription.ToLower().Contains(" " + searchWords[x] + " ")
|| item.basedescription.ToLower().Contains(" " + service.Pluralize(searchWords[x]) + " ")
|| item.basedescription.ToLower().Contains(" " + service.Singularize(searchWords[x]) + " ")
|| item.basedescription.ToLower().Contains(searchWords[x])
|| item.basedescription.ToLower().Contains(service.Pluralize(searchWords[x]))
|| item.basedescription.ToLower().Contains(service.Singularize(searchWords[x])))
|| (item.info.ToLower().StartsWith(searchWords[x] + " ")
|| item.info.ToLower().StartsWith(service.Pluralize(searchWords[x]) + " ")
|| item.info.ToLower().StartsWith(service.Singularize(searchWords[x]) + " ")
|| item.info.ToLower().EndsWith(" " + searchWords[x])
|| item.info.ToLower().EndsWith(" " + service.Pluralize(searchWords[x]))
|| item.info.ToLower().EndsWith(" " + service.Singularize(searchWords[x]))
|| item.info.ToLower().Contains(" " + searchWords[x] + " ")
|| item.info.ToLower().Contains(" " + service.Pluralize(searchWords[x]) + " ")
|| item.info.ToLower().Contains(" " + service.Singularize(searchWords[x]) + " ")
|| item.info.ToLower().Contains(searchWords[x])
|| item.info.ToLower().Contains(service.Pluralize(searchWords[x]))
|| item.info.ToLower().Contains(service.Singularize(searchWords[x])))
|| (item.itemgroup.ToLower().StartsWith(searchWords[x] + " ")
|| item.itemgroup.ToLower().StartsWith(service.Singularize(searchWords[x]) + " ")
|| item.itemgroup.ToLower().EndsWith(" " + searchWords[x])
|| item.itemgroup.ToLower().EndsWith(" " + service.Singularize(searchWords[x]))
|| item.itemgroup.ToLower().Contains(" " + searchWords[x] + " ")
|| item.itemgroup.ToLower().Contains(" " + service.Singularize(searchWords[x]) + " ")
|| item.itemgroup.ToLower().Contains(searchWords[x])
|| item.itemgroup.ToLower().Contains(service.Singularize(searchWords[x])))
|| (item.itembrand.ToLower().StartsWith(searchWords[x] + " ")
|| item.itembrand.ToLower().EndsWith(" " + searchWords[x])
|| item.itembrand.ToLower().Contains(" " + searchWords[x] + " ")
|| item.itembrand.ToLower().Contains(searchWords[x]))
|| (item.itemtype.ToLower().StartsWith(searchWords[x] + " ")
|| item.itemtype.ToLower().StartsWith(service.Pluralize(searchWords[x]) + " ")
|| item.itemtype.ToLower().StartsWith(service.Singularize(searchWords[x]) + " ")
|| item.itemtype.ToLower().EndsWith(" " + searchWords[x])
|| item.itemtype.ToLower().EndsWith(" " + service.Pluralize(searchWords[x]))
|| item.itemtype.ToLower().EndsWith(" " + service.Singularize(searchWords[x]))
|| item.itemtype.ToLower().Contains(" " + searchWords[x] + " ")
|| item.itemtype.ToLower().Contains(" " + service.Pluralize(searchWords[x]) + " ")
|| item.itemtype.ToLower().Contains(" " + service.Singularize(searchWords[x]) + " ")
|| item.itemtype.ToLower().Contains(searchWords[x])
|| item.itemtype.ToLower().Contains(service.Pluralize(searchWords[x]))
|| item.itemtype.ToLower().Contains(service.Singularize(searchWords[x])))
|| (item.itemsubtype.ToLower().StartsWith(searchWords[x] + " ")
|| item.itemsubtype.ToLower().StartsWith(service.Pluralize(searchWords[x]) + " ")
|| item.itemsubtype.ToLower().StartsWith(service.Singularize(searchWords[x]) + " ")
|| item.itemsubtype.ToLower().EndsWith(" " + searchWords[x])
|| item.itemsubtype.ToLower().EndsWith(" " + service.Pluralize(searchWords[x]))
|| item.itemsubtype.ToLower().EndsWith(" " + service.Singularize(searchWords[x]))
|| item.itemsubtype.ToLower().Contains(" " + searchWords[x] + " ")
|| item.itemsubtype.ToLower().Contains(" " + service.Pluralize(searchWords[x]) + " ")
|| item.itemsubtype.ToLower().Contains(" " + service.Singularize(searchWords[x]) + " ")
|| item.itemsubtype.ToLower().Contains(searchWords[x])
|| item.itemsubtype.ToLower().Contains(service.Pluralize(searchWords[x]))
|| item.itemsubtype.ToLower().Contains(service.Singularize(searchWords[x])))
).ToList();
This query takes roughly 10 seconds to execute on the first word, and is pretty quick on the rest of the words. How can I significantly improve the performance of this LINQ query while maintaining flexibility of search results?