diff --git a/dotnet/samples/Concepts/Search/Bing_TextSearch.cs b/dotnet/samples/Concepts/Search/Bing_TextSearch.cs
index 78e0af672036..b862360d740c 100644
--- a/dotnet/samples/Concepts/Search/Bing_TextSearch.cs
+++ b/dotnet/samples/Concepts/Search/Bing_TextSearch.cs
@@ -119,6 +119,86 @@ public async Task UsingBingTextSearchWithASiteFilterAsync()
}
}
+ ///
+ /// Show how to use enhanced LINQ filtering with BingTextSearch for type-safe searches.
+ ///
+ [Fact]
+ public async Task UsingBingTextSearchWithLinqFilteringAsync()
+ {
+ // Create a logging handler to output HTTP requests and responses
+ LoggingHandler handler = new(new HttpClientHandler(), this.Output);
+ using HttpClient httpClient = new(handler);
+
+ // Create an ITextSearch instance for type-safe LINQ filtering
+ ITextSearch textSearch = new BingTextSearch(apiKey: TestConfiguration.Bing.ApiKey, options: new() { HttpClient = httpClient });
+
+ var query = "Semantic Kernel AI";
+
+ // Example 1: Filter by language (English only)
+ Console.WriteLine("——— Example 1: Language Filter (English) ———\n");
+ var languageOptions = new TextSearchOptions
+ {
+ Top = 2,
+ Filter = page => page.Language == "en"
+ };
+ var languageResults = await textSearch.SearchAsync(query, languageOptions);
+ await foreach (string result in languageResults.Results)
+ {
+ Console.WriteLine(result);
+ WriteHorizontalRule();
+ }
+
+ // Example 2: Filter by family-friendly content
+ Console.WriteLine("\n——— Example 2: Family Friendly Filter ———\n");
+ var familyFriendlyOptions = new TextSearchOptions
+ {
+ Top = 2,
+ Filter = page => page.IsFamilyFriendly == true
+ };
+ var familyFriendlyResults = await textSearch.SearchAsync(query, familyFriendlyOptions);
+ await foreach (string result in familyFriendlyResults.Results)
+ {
+ Console.WriteLine(result);
+ WriteHorizontalRule();
+ }
+
+ // Example 3: Compound AND filtering (language + family-friendly)
+ Console.WriteLine("\n——— Example 3: Compound Filter (English + Family Friendly) ———\n");
+ var compoundOptions = new TextSearchOptions
+ {
+ Top = 2,
+ Filter = page => page.Language == "en" && page.IsFamilyFriendly == true
+ };
+ var compoundResults = await textSearch.GetSearchResultsAsync(query, compoundOptions);
+ await foreach (BingWebPage page in compoundResults.Results)
+ {
+ Console.WriteLine($"Name: {page.Name}");
+ Console.WriteLine($"Snippet: {page.Snippet}");
+ Console.WriteLine($"Language: {page.Language}");
+ Console.WriteLine($"Family Friendly: {page.IsFamilyFriendly}");
+ WriteHorizontalRule();
+ }
+
+ // Example 4: Complex compound filtering with nullable checks
+ Console.WriteLine("\n——— Example 4: Complex Compound Filter (Language + Site + Family Friendly) ———\n");
+ var complexOptions = new TextSearchOptions
+ {
+ Top = 2,
+ Filter = page => page.Language == "en" &&
+ page.IsFamilyFriendly == true &&
+ page.DisplayUrl != null && page.DisplayUrl.Contains("microsoft")
+ };
+ var complexResults = await textSearch.GetSearchResultsAsync(query, complexOptions);
+ await foreach (BingWebPage page in complexResults.Results)
+ {
+ Console.WriteLine($"Name: {page.Name}");
+ Console.WriteLine($"Display URL: {page.DisplayUrl}");
+ Console.WriteLine($"Language: {page.Language}");
+ Console.WriteLine($"Family Friendly: {page.IsFamilyFriendly}");
+ WriteHorizontalRule();
+ }
+ }
+
#region private
///
/// Test mapper which converts an arbitrary search result to a string using JSON serialization.
diff --git a/dotnet/samples/Concepts/Search/Google_TextSearch.cs b/dotnet/samples/Concepts/Search/Google_TextSearch.cs
index a77f65bcfbc3..749405422faf 100644
--- a/dotnet/samples/Concepts/Search/Google_TextSearch.cs
+++ b/dotnet/samples/Concepts/Search/Google_TextSearch.cs
@@ -26,7 +26,7 @@ public async Task UsingGoogleTextSearchAsync()
var query = "What is the Semantic Kernel?";
// Search and return results as string items
- KernelSearchResults stringResults = await textSearch.SearchAsync(query, new() { Top = 4, Skip = 0 });
+ KernelSearchResults stringResults = await textSearch.SearchAsync(query, new TextSearchOptions { Top = 4, Skip = 0 });
Console.WriteLine("——— String Results ———\n");
await foreach (string result in stringResults.Results)
{
@@ -35,7 +35,7 @@ public async Task UsingGoogleTextSearchAsync()
}
// Search and return results as TextSearchResult items
- KernelSearchResults textResults = await textSearch.GetTextSearchResultsAsync(query, new() { Top = 4, Skip = 4 });
+ KernelSearchResults textResults = await textSearch.GetTextSearchResultsAsync(query, new TextSearchOptions { Top = 4, Skip = 4 });
Console.WriteLine("\n——— Text Search Results ———\n");
await foreach (TextSearchResult result in textResults.Results)
{
@@ -46,7 +46,7 @@ public async Task UsingGoogleTextSearchAsync()
}
// Search and return results as Google.Apis.CustomSearchAPI.v1.Data.Result items
- KernelSearchResults