SkillAgentSearch skills...

SearchExtensions

Library of IQueryable extension methods to perform searching

Install / Use

/learn @ninjanye/SearchExtensions
About this skill

Quality Score

0/100

Supported Platforms

Universal

README

SearchExtensions

NuGet Downloads Stars License

SearchExtensions is a library of IQueryable and IEnumerable extension methods to perform searching. More information on these packages and it's use can be found by, visiting my blog.

This project represents the source code for the following 3 nuget packages:

Release notes

  • Soundex support migrated to dedicated nuget package
  • Levenshtein support migrated to dedicated nuget package
  • Constructed expressions can now be pulled out and re-used.

As of version 3.0 Soundex and Levenshtein support has been migrated into their own respective packages (above). All functionality still remains. If you are currently using Levensthein or Soundex functionlity in version 2.2 or lower, please upgrade to you the dedicated package.

IQueryable Searching

The IQueryable extension methods build expression trees based on your command chain and then sends this request to the data provider when required. This means that your data provider is restricting the records that are brought into memory instead of having all records brought into, and filtered, in memory.

Methods

Search methods available to IQueryable data are:

  • Containing - target property contains search term or terms
  • IsEqual - target property equals search term or terms
  • StartsWith - target property starts with search term or terms

How to: Performing Containing searches

Search for a single search term within a single property

var result = queryableData.Search(x => x.Property1)
                          .Containing("searchTerm");

Search for a single search term within multiple properties

var result = queryableData.Search(x => x.Property1,
                                  x => x.Property2,
                                  x => x.Property3)
                          .Containing("searchTerm");

Search for multiple search terms within a single property

var result = queryableData.Search(x => x.Property1)
                          .Containing("search", "term");

Search for multiple search terms within multiple properties

var result = queryableData.Search(x => x.Property1,
                                  x => x.Property2,
                                  x => x.Property3)
                          .Containing("searchTerm1",
                                      "searchTerm2",
                                      "searchTerm3");

How to: Performing Containing AND searches

Search where a single property contains a single search term
AND a another property contains a single search term

var result = queryableData.Search(x => x.Property1)
                          .Containing("searchTerm1")
                          .Search(x => x.Property1)
                          .Containing("searchTerm2");

Search where a single search term exists within in Property1 OR Property2
AND single search term exists within in Property3 OR Property4

var result = queryableData.Search(x => x.Property1, x => x.Property2)
                          .Containing("searchTerm")
                          .Search(x => x.Property3, x => x.Property4)
                          .Containing("searchTerm");

Search where a single search term exists in Property1 OR Property2
AND any of the multiple search terms exist within a single property

var result = queryableData.Search(x => x.Property1, x => x.Property2)
                          .Containing("searchTerm")
                          .Search(x => x.Property3)
                          .Containing("another", "term");

How to: Performing IsEqual searches

Search where a single property equals a single search term

var result = queryableData.Search(x => x.Property1)
                          .IsEqual("searchTerm");

Search where any one of multiple properties is equal to a single search term

var result = queryableData.Search(x => x.Property1,
                                  x => x.Property2,
                                  x => x.Property3)
                          .IsEqual("searchTerm");

Search where a single property is equal to any one of multiple search terms

var result = queryableData.Search(x => x.Property1)
                          .IsEqual("search", "term");

Search where any one of multiple properties is equal to any one of multiple search terms

var result = queryableData.Search(x => x.Property1,
                                  x => x.Property2,
                                  x => x.Property3)
                          .IsEqual("searchTerm1",
                                   "searchTerm2",
                                   "searchTerm3");

How to: Performing StartsWith searches

Search where a single property starts with a single search term

var result = queryableData.Search(x => x.Property1)
                          .StartsWith("searchTerm");

Search where any one of multiple properties starts with to a single search term

var result = queryableData.Search(x => x.Property1,
                                  x => x.Property2,
                                  x => x.Property3)
                          .StartsWith("searchTerm");

Search where a single property starts with any one of multiple search terms

var result = queryableData.Search(x => x.Property1)
                          .StartsWith("search", "term");

Search where any one of multiple properties starts with any one of multiple search terms

var result = queryableData.Search(x => x.Property1,
                                  x => x.Property2,
                                  x => x.Property3)
                          .StartsWith("searchTerm1",
                                      "searchTerm2",
                                      "searchTerm3");

How to: Combining instructions

With the latest version of SearchExtensions you can also combine search actions. For instance

Search where a single property starts with a single search term AND containing a single search term

var result = queryableData.Search(x => x.Property1)
                          .StartsWith("abc")
                          .Containing("mno");

The ability to pass multiple search terms to any of the action methods still remains:

var result = queryableData.Search(x => x.Property1, x => x.Property2)
                          // that starts with "abc" OR "ninja"
                          .StartsWith("abc", "ninja")
                          // and contains "xyz" OR "extensions"
                          .Containing("xyz", "extensions")  

IEnumerable (in memory) Searches

SearchExtensions has also been extended to support IEnumerable collections.

This means you can now perform all of the above searches on in memory collections should you need to.

Methods

Currently IEnumerable searching has more features available to it than IQueryable, namely EndsWith and SetCulture

  • SetCulture - Sets the string comparison culture with which to perform searches
  • Containing - target property contains search term or terms
  • IsEqual - target property equals search term or terms
  • StartsWith - target property starts with search term or terms
  • EndsWith - target property ends with search term or terms

The important thing to remember when performing an in memory search is to set the culture to the type of string comparison you wish to perform. If SetCulture is not specified, StringComparison.CurrentCulture is used.

How to: Performing IEnumerable searches

These methods are identical to that of the IQueryable methods.

var result = enumerableData.Search(x => x.Property1)
                           .SetCulture(StringComparison.OrdinalIgnoreCase) // Set culture for comparison
                           .StartsWith("abc")
                           .EndsWith("xyz")
                           .Containing("mno");

It is also possible to switch the StringComparison culture context multiple times

var result = enumerableData.Search(x => x.Property1)
                           .SetCulture(StringComparison.OrdinalIgnoreCase)
                           .StartsWith("abc")  // Uses OrdinalIgnoreCase
                           .SetCulture(StringComparison.Ordinal)
                           .EndsWith("xyz")    // Uses Ordinal
                           .SetCulture(Str
View on GitHub
GitHub Stars344
CategoryDevelopment
Updated1mo ago
Forks49

Languages

C#

Security Score

95/100

Audited on Feb 9, 2026

No findings