MrDHelper 3.0.0

dotnet add package MrDHelper --version 3.0.0
                    
NuGet\Install-Package MrDHelper -Version 3.0.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="MrDHelper" Version="3.0.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="MrDHelper" Version="3.0.0" />
                    
Directory.Packages.props
<PackageReference Include="MrDHelper" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add MrDHelper --version 3.0.0
                    
#r "nuget: MrDHelper, 3.0.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package MrDHelper@3.0.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=MrDHelper&version=3.0.0
                    
Install as a Cake Addin
#tool nuget:?package=MrDHelper&version=3.0.0
                    
Install as a Cake Tool

MrDHelper

NuGet version NuGet downloads License

Common helpers and extension methods for .NET projects, with support for:

  • collection helpers
  • string, bool, date, and geo utilities
  • Result / Result<T> models
  • DisplayAttribute reflection helpers
  • EF Core paging and search extensions
  • SQLite FTS5 integration
  • MudBlazor search state helpers

Target Framework

  • .NET 9

Installation

dotnet add package MrDHelper

Quick Start

using MrDHelper;
using MrDHelper.CollectionHelpers.IEnummerableHelper;
using MrDHelper.CollectionHelpers.IListHelper;
using MrDHelper.Models;

var values = new[] { 1, 2, 3 };
var total = 0;

values.ForEach(x => total += x);

var md5 = "hello".GetMd5();
var normalized = StringHelper.Normalize("  Ha Noi  ");

var result = Result<int>.Ok(total, "done");

Main Features

Collection Helpers

using MrDHelper.CollectionHelpers.IEnummerableHelper;
using MrDHelper.CollectionHelpers.IListHelper;

IEnumerable<int> numbers = new[] { 1, 2, 3 };
await numbers.ForEachAsync(async x => await Task.Delay(x));

IList<string> items = new List<string> { "A" };
items.AddDummyItemsToMaximumCountOf(3, "-");
// Result: [ "A", "-", "-" ]

Primitive and Value Helpers

using MrDHelper;
using MrDHelper.ValueTypeHelpers.BoolHelper;
using MrDHelper.ValueTypeHelpers.DateTimeHelper;
using MrDHelper.ValueTypeHelpers.GeoPointHelper;

var isEmpty = "".IsNullOrEmpty();
var isTrue = ((bool?)true).IsTrue();
var when = DateTimeOffset.UtcNow.ToVietnamString();
var compact = 1540d.ToCompactDistance(); // "1.5km"

Result Models

using MrDHelper.Models;

var success = Result<string>.Ok("payload", "completed");
var failure = Result<string>.Failure("VALIDATION", "Invalid input");

var message = success.Match(
    onSuccess: value => $"OK: {value}",
    onFailure: error => $"ERR: {error.Description}");

DisplayAttribute Helpers

using MrDHelper.GenericHelper;

var displayName = myEnumValue.GetDisplayName();
var orderedProps = DisplayExtensions.GetDisplayOrderedProperties(typeof(MyViewModel));
var enumItems = DisplayExtensions.GetValueLabelListForEnum<MyEnum>();

Cell Conversion Helpers

using MrDHelper.CellHelpers;

var cell = model.ConvertToCell();
cell["Name"] = "Updated";

var restored = cell.ConvertTo<MyModel>();
using MrDHelper.AppData.Extensions;

var page = await db.Reports
    .AsNoTracking()
    .ApplySearchClientSide("ha noi", x => x.Title, x => x.Summary)
    .OrderBy(x => x.Id)
    .ToPagedAsync(page: 0, pageSize: 20);

Available extensions include:

  • ToPagedAsync
  • ToPagedSliceAsync
  • ApplySearchClientSide
  • ApplySearchAnyClientSide
  • ApplySearchAnyServerSide

SQLite FTS5

MrDHelper includes a lightweight SQLite FTS5 integration layer for EF Core.

  1. Implement IHasGuidId and IFtsIndexed.
using MrDHelper.AppDomain.EfSqliteFts5;

public sealed class DonVi : IHasGuidId, IFtsIndexed
{
    public Guid Id { get; set; }
    public string Code { get; set; } = string.Empty;
    public string Name { get; set; } = string.Empty;

    public string BuildFtsAllText()
        => string.Join(" | ", new[] { Code, Name });
}
  1. Register the FTS mapping once at startup.
using MrDHelper.AppDomain.EfSqliteFts5;

FtsRegistry.Register<DonVi>(
    mainTable: "DonVis",
    ftsTable: "DonVi_fts",
    idColumn: "Id");
  1. Add the save interceptor and ensure the FTS schema.
using Microsoft.EntityFrameworkCore;
using MrDHelper.AppDomain.EfSqliteFts5;

services.AddDbContext<AppDbContext>(options =>
{
    options.UseSqlite("Data Source=app.db");
    options.AddInterceptors(new SqliteFtsSaveChangesInterceptor());
});

await db.Database.MigrateAsync();
await FtsSchema.EnsureFtsTablesAsync(db);
  1. Search with FtsSearchService.
using MrDHelper.AppDomain.EfSqliteFts5;
using MrDHelper.MudBlazor.Search;

var service = new FtsSearchService(db);

var result = await service.SearchAsync<DonVi>(
    new SearchQuery { Search = "ha noi", Page = 0, PageSize = 20 },
    q => q.OrderBy(x => x.Name),
    cancellationToken);

MudBlazor Search State

using MrDHelper.MudBlazor.Search;

var store = new SearchQueryStore();
store.SetActiveKey("users");

store.UpdateActive(query =>
{
    query.Search = "admin";
    query.Page = 0;
}, SearchQueryChangeSource.Ui);

Test

dotnet test MrDHelper.sln

Repository Structure

  • MrDHelper/: library source
  • MrDHelper.Tests/: NUnit test project
  • Images/: package and repository assets

Contributing

Issues and pull requests are welcome.

If you change public helpers or extension methods, please update tests together with the code.

License

Distributed under the MIT License. See LICENSE.txt.

Product Compatible and additional computed target framework versions.
.NET net9.0 is compatible.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
3.0.0 126 3/20/2026
2.2.1 131 3/15/2026
2.2.0 121 3/15/2026
2.1.6 131 3/15/2026
2.1.5 115 3/14/2026
2.1.4 127 3/14/2026
2.1.3 115 3/3/2026
2.1.2 115 3/2/2026
2.1.1 125 2/8/2026
2.1.0 129 1/31/2026
2.0.9 143 1/25/2026
2.0.8 139 1/19/2026
2.0.7 131 1/18/2026
2.0.6 132 1/18/2026
2.0.5 138 1/18/2026
2.0.4 136 1/18/2026
2.0.3 316 11/14/2025
2.0.2 350 11/13/2025
2.0.1 330 11/13/2025
1.1.2 342 11/13/2025
Loading failed

Fixing bugs