diff --git a/Gantt/IntegrationWithNet10/Binding Dapper using Url Adaptor/Blazor Web App/Gantt_Dapper/GanttDapper.Client/GanttDapper.Client.csproj b/Gantt/IntegrationWithNet10/Binding Dapper using Url Adaptor/Blazor Web App/Gantt_Dapper/GanttDapper.Client/GanttDapper.Client.csproj
new file mode 100644
index 00000000..5d5e7bb7
--- /dev/null
+++ b/Gantt/IntegrationWithNet10/Binding Dapper using Url Adaptor/Blazor Web App/Gantt_Dapper/GanttDapper.Client/GanttDapper.Client.csproj
@@ -0,0 +1,17 @@
+
+
+
+ net9.0
+ enable
+ enable
+ true
+ Default
+
+
+
+
+
+
+
+
+
diff --git a/Gantt/IntegrationWithNet10/Binding Dapper using Url Adaptor/Blazor Web App/Gantt_Dapper/GanttDapper.Client/Pages/Home.razor b/Gantt/IntegrationWithNet10/Binding Dapper using Url Adaptor/Blazor Web App/Gantt_Dapper/GanttDapper.Client/Pages/Home.razor
new file mode 100644
index 00000000..ed2a6756
--- /dev/null
+++ b/Gantt/IntegrationWithNet10/Binding Dapper using Url Adaptor/Blazor Web App/Gantt_Dapper/GanttDapper.Client/Pages/Home.razor
@@ -0,0 +1,49 @@
+@page "/"
+@rendermode InteractiveAuto
+
+@using Syncfusion.Blazor.Gantt
+@using Syncfusion.Blazor.Data
+@using Syncfusion.Blazor
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+@code {
+
+ // Keep same model names used in controller response (TaskData)
+ public class TaskData
+ {
+ public int? TaskId { get; set; }
+ public string? TaskName { get; set; }
+ public DateTime? StartDate { get; set; }
+ public DateTime? EndDate { get; set; }
+ public int? ParentId { get; set; }
+ public string Predecessor { get; set; }
+ public int? Duration { get; set; }
+ public int? Progress { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/Gantt/IntegrationWithNet10/Binding Dapper using Url Adaptor/Blazor Web App/Gantt_Dapper/GanttDapper.Client/Program.cs b/Gantt/IntegrationWithNet10/Binding Dapper using Url Adaptor/Blazor Web App/Gantt_Dapper/GanttDapper.Client/Program.cs
new file mode 100644
index 00000000..b74a661a
--- /dev/null
+++ b/Gantt/IntegrationWithNet10/Binding Dapper using Url Adaptor/Blazor Web App/Gantt_Dapper/GanttDapper.Client/Program.cs
@@ -0,0 +1,9 @@
+using Microsoft.AspNetCore.Components.WebAssembly.Hosting;
+using Syncfusion.Blazor;
+
+
+var builder = WebAssemblyHostBuilder.CreateDefault(args);
+
+builder.Services.AddSyncfusionBlazor();
+
+await builder.Build().RunAsync();
diff --git a/Gantt/IntegrationWithNet10/Binding Dapper using Url Adaptor/Blazor Web App/Gantt_Dapper/GanttDapper.Client/_Imports.razor b/Gantt/IntegrationWithNet10/Binding Dapper using Url Adaptor/Blazor Web App/Gantt_Dapper/GanttDapper.Client/_Imports.razor
new file mode 100644
index 00000000..06f27620
--- /dev/null
+++ b/Gantt/IntegrationWithNet10/Binding Dapper using Url Adaptor/Blazor Web App/Gantt_Dapper/GanttDapper.Client/_Imports.razor
@@ -0,0 +1,9 @@
+@using System.Net.Http
+@using System.Net.Http.Json
+@using Microsoft.AspNetCore.Components.Forms
+@using Microsoft.AspNetCore.Components.Routing
+@using Microsoft.AspNetCore.Components.Web
+@using static Microsoft.AspNetCore.Components.Web.RenderMode
+@using Microsoft.AspNetCore.Components.Web.Virtualization
+@using Microsoft.JSInterop
+@using GanttDapper.Client
diff --git a/Gantt/IntegrationWithNet10/Binding Dapper using Url Adaptor/Blazor Web App/Gantt_Dapper/GanttDapper/Components/App.razor b/Gantt/IntegrationWithNet10/Binding Dapper using Url Adaptor/Blazor Web App/Gantt_Dapper/GanttDapper/Components/App.razor
new file mode 100644
index 00000000..7bb30fc6
--- /dev/null
+++ b/Gantt/IntegrationWithNet10/Binding Dapper using Url Adaptor/Blazor Web App/Gantt_Dapper/GanttDapper/Components/App.razor
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Gantt/IntegrationWithNet10/Binding Dapper using Url Adaptor/Blazor Web App/Gantt_Dapper/GanttDapper/Components/Layout/MainLayout.razor b/Gantt/IntegrationWithNet10/Binding Dapper using Url Adaptor/Blazor Web App/Gantt_Dapper/GanttDapper/Components/Layout/MainLayout.razor
new file mode 100644
index 00000000..c3b55acb
--- /dev/null
+++ b/Gantt/IntegrationWithNet10/Binding Dapper using Url Adaptor/Blazor Web App/Gantt_Dapper/GanttDapper/Components/Layout/MainLayout.razor
@@ -0,0 +1,10 @@
+@inherits LayoutComponentBase
+
+
+
+
+ @Body
+
+
+
+
diff --git a/Gantt/IntegrationWithNet10/Binding Dapper using Url Adaptor/Blazor Web App/Gantt_Dapper/GanttDapper/Components/Layout/MainLayout.razor.css b/Gantt/IntegrationWithNet10/Binding Dapper using Url Adaptor/Blazor Web App/Gantt_Dapper/GanttDapper/Components/Layout/MainLayout.razor.css
new file mode 100644
index 00000000..c3c85552
--- /dev/null
+++ b/Gantt/IntegrationWithNet10/Binding Dapper using Url Adaptor/Blazor Web App/Gantt_Dapper/GanttDapper/Components/Layout/MainLayout.razor.css
@@ -0,0 +1,16 @@
+.page {
+ position: relative;
+ display: flex;
+ flex-direction: column;
+}
+
+main {
+ flex: 1;
+}
+
+@media (min-width: 641px) {
+ .page {
+ flex-direction: row;
+ }
+}
+
diff --git a/Gantt/IntegrationWithNet10/Binding Dapper using Url Adaptor/Blazor Web App/Gantt_Dapper/GanttDapper/Components/Pages/Error.razor b/Gantt/IntegrationWithNet10/Binding Dapper using Url Adaptor/Blazor Web App/Gantt_Dapper/GanttDapper/Components/Pages/Error.razor
new file mode 100644
index 00000000..b9818ce0
--- /dev/null
+++ b/Gantt/IntegrationWithNet10/Binding Dapper using Url Adaptor/Blazor Web App/Gantt_Dapper/GanttDapper/Components/Pages/Error.razor
@@ -0,0 +1,36 @@
+@page "/Error"
+@using System.Diagnostics
+
+Error
+
+
Error.
+
An error occurred while processing your request.
+
+@if (ShowRequestId)
+{
+
+ Request ID:@RequestId
+
+}
+
+
Development Mode
+
+ Swapping to Development environment will display more detailed information about the error that occurred.
+
+
+ The Development environment shouldn't be enabled for deployed applications.
+ It can result in displaying sensitive information from exceptions to end users.
+ For local debugging, enable the Development environment by setting the ASPNETCORE_ENVIRONMENT environment variable to Development
+ and restarting the app.
+
+
+@code{
+ [CascadingParameter]
+ private HttpContext? HttpContext { get; set; }
+
+ private string? RequestId { get; set; }
+ private bool ShowRequestId => !string.IsNullOrEmpty(RequestId);
+
+ protected override void OnInitialized() =>
+ RequestId = Activity.Current?.Id ?? HttpContext?.TraceIdentifier;
+}
\ No newline at end of file
diff --git a/Gantt/IntegrationWithNet10/Binding Dapper using Url Adaptor/Blazor Web App/Gantt_Dapper/GanttDapper/Components/Routes.razor b/Gantt/IntegrationWithNet10/Binding Dapper using Url Adaptor/Blazor Web App/Gantt_Dapper/GanttDapper/Components/Routes.razor
new file mode 100644
index 00000000..d39c7e89
--- /dev/null
+++ b/Gantt/IntegrationWithNet10/Binding Dapper using Url Adaptor/Blazor Web App/Gantt_Dapper/GanttDapper/Components/Routes.razor
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/Gantt/IntegrationWithNet10/Binding Dapper using Url Adaptor/Blazor Web App/Gantt_Dapper/GanttDapper/Components/_Imports.razor b/Gantt/IntegrationWithNet10/Binding Dapper using Url Adaptor/Blazor Web App/Gantt_Dapper/GanttDapper/Components/_Imports.razor
new file mode 100644
index 00000000..9ee6f787
--- /dev/null
+++ b/Gantt/IntegrationWithNet10/Binding Dapper using Url Adaptor/Blazor Web App/Gantt_Dapper/GanttDapper/Components/_Imports.razor
@@ -0,0 +1,11 @@
+@using System.Net.Http
+@using System.Net.Http.Json
+@using Microsoft.AspNetCore.Components.Forms
+@using Microsoft.AspNetCore.Components.Routing
+@using Microsoft.AspNetCore.Components.Web
+@using static Microsoft.AspNetCore.Components.Web.RenderMode
+@using Microsoft.AspNetCore.Components.Web.Virtualization
+@using Microsoft.JSInterop
+@using GanttDapper
+@using GanttDapper.Client
+@using GanttDapper.Components
diff --git a/Gantt/IntegrationWithNet10/Binding Dapper using Url Adaptor/Blazor Web App/Gantt_Dapper/GanttDapper/Controllers/GanttController.cs b/Gantt/IntegrationWithNet10/Binding Dapper using Url Adaptor/Blazor Web App/Gantt_Dapper/GanttDapper/Controllers/GanttController.cs
new file mode 100644
index 00000000..b3b7152a
--- /dev/null
+++ b/Gantt/IntegrationWithNet10/Binding Dapper using Url Adaptor/Blazor Web App/Gantt_Dapper/GanttDapper/Controllers/GanttController.cs
@@ -0,0 +1,234 @@
+using Microsoft.AspNetCore.Mvc;
+using Syncfusion.Blazor.Data;
+using Syncfusion.Blazor;
+using System.ComponentModel.DataAnnotations;
+using System.Data;
+using Dapper;
+using Microsoft.Data.SqlClient;
+using System.Text.Json.Serialization;
+
+namespace GanttDapper.Controllers
+{
+ ///
+ /// API controller providing CRUD and query endpoints for Gantt tasks using Dapper.
+ /// Accepts Syncfusion DataManager requests and returns task results suitable for UrlAdaptor.
+ ///
+ [ApiController]
+ public class GanttController : ControllerBase
+ {
+ private readonly string ConnectionString = "Data Source=SYNCLAPN-46292\\SQLEXPRESS;Initial Catalog=ganttdb;Integrated Security=True;TrustServerCertificate=True;";
+
+ ///
+ /// Handles a DataManagerRequest from the client and returns filtered, searched, sorted and paged task data.
+ ///
+ /// The Syncfusion containing search/filter/sort/paging instructions.
+ ///
+ /// An object containing `result` (the task IEnumerable) and `count` (the total record count).
+ /// Returned shape matches UrlAdaptor expectations.
+ ///
+ [HttpPost]
+ [Route("api/[controller]")]
+ public object Post([FromBody] DataManagerRequest DataManagerRequest)
+ {
+ IEnumerable DataSource = GetTaskData();
+
+ if (DataManagerRequest.Search != null && DataManagerRequest.Search.Count > 0)
+ DataSource = DataOperations.PerformSearching(DataSource, DataManagerRequest.Search);
+
+ if (DataManagerRequest.Where != null && DataManagerRequest.Where.Count > 0)
+ DataSource = DataOperations.PerformFiltering(DataSource, DataManagerRequest.Where, DataManagerRequest.Where[0].Operator);
+
+ if (DataManagerRequest.Sorted != null && DataManagerRequest.Sorted.Count > 0)
+ DataSource = DataOperations.PerformSorting(DataSource, DataManagerRequest.Sorted);
+
+ int TotalRecordsCount = DataSource.Count();
+
+ if (DataManagerRequest.Skip != 0)
+ DataSource = DataOperations.PerformSkip(DataSource, DataManagerRequest.Skip);
+
+ if (DataManagerRequest.Take != 0)
+ DataSource = DataOperations.PerformTake(DataSource, DataManagerRequest.Take);
+
+ return new { result = DataSource, count = TotalRecordsCount };
+ }
+
+ ///
+ /// Retrieves all tasks from the database ordered for hierarchical display (parents before children).
+ ///
+ /// A containing all tasks.
+ [Route("api/[controller]/GetTaskData")]
+ public List GetTaskData()
+ {
+ string Query = @"SELECT TaskId, TaskName, StartDate, EndDate, ParentId, Duration, Predecessor, Progress FROM task_data
+ ORDER BY CASE WHEN ParentId IS NULL THEN 0 ELSE 1 END, ParentId, TaskId;";
+
+ using IDbConnection Connection = new SqlConnection(ConnectionString);
+ Connection.Open();
+ return Connection.Query(Query).ToList();
+ }
+
+ ///
+ /// Inserts a new task into the database and returns the created task (including assigned TaskId).
+ ///
+ /// A whose Value contains the task to insert.
+ ///
+ /// An with the created on success, or a BadRequest result with error details.
+ ///
+ [HttpPost]
+ [Route("api/Gantt/Insert")]
+ public IActionResult Insert([FromBody] CRUDModel Value)
+ {
+ try
+ {
+ var task = Value?.Value ?? new TaskData();
+
+ // Defaults to satisfy NOT NULL columns
+ task.TaskName ??= "New Task";
+ task.Duration ??= 1;
+ task.Progress ??= 0;
+ task.StartDate ??= DateTime.Now;
+
+ string Query = @"INSERT INTO task_data (TaskName, StartDate, EndDate, ParentId, Duration, Predecessor, Progress)
+ VALUES (@TaskName, @StartDate, @EndDate, @ParentId, @Duration, @Predecessor, @Progress);
+ SELECT CAST(SCOPE_IDENTITY() as int);";
+
+ using IDbConnection Connection = new SqlConnection(ConnectionString);
+ Connection.Open();
+
+ int newId = Connection.ExecuteScalar(Query, task);
+ task.TaskId = newId;
+
+ // UrlAdaptor expects JSON response
+ return Ok(task);
+ }
+ catch (Exception ex)
+ {
+ // return JSON (so client won't crash JSON parsing)
+ return BadRequest(new { message = ex.Message, detail = ex.ToString() });
+ }
+ }
+
+ ///
+ /// Updates an existing task in the database.
+ ///
+ /// A whose Value contains the updated task data (must include TaskId).
+ ///
+ /// An with the updated on success, or a BadRequest result with error details.
+ ///
+ [HttpPost]
+ [Route("api/Gantt/Update")]
+ public IActionResult Update([FromBody] CRUDModel Value)
+ {
+ try
+ {
+ var task = Value?.Value;
+
+ string Query = @"
+ UPDATE task_data
+ SET
+ TaskName = @TaskName,
+ StartDate = @StartDate,
+ EndDate = @EndDate,
+ ParentId = @ParentId,
+ Duration = @Duration,
+ Predecessor = @Predecessor,
+ Progress = @Progress
+ WHERE TaskId = @TaskId;";
+
+ using IDbConnection Connection = new SqlConnection(ConnectionString);
+ Connection.Open();
+ Connection.Execute(Query, task);
+
+ return Ok(task);
+ }
+ catch (Exception ex)
+ {
+ return BadRequest(new { message = ex.Message, detail = ex.ToString() });
+ }
+ }
+
+ ///
+ /// Deletes a task identified by the CRUDModel key.
+ ///
+ /// A where Key identifies the TaskId to remove.
+ ///
+ /// An with the deleted TaskId on success, or a BadRequest result with error details.
+ ///
+ [HttpPost]
+ [Route("api/Gantt/Delete")]
+ public IActionResult Delete([FromBody] CRUDModel Value)
+ {
+ try
+ {
+ int taskId = Convert.ToInt32(Value.Key?.ToString());
+
+ string Query = "DELETE FROM task_data WHERE TaskId = @TaskId;";
+
+ using IDbConnection Connection = new SqlConnection(ConnectionString);
+ Connection.Open();
+ Connection.Execute(Query, new { TaskId = taskId });
+
+ return Ok(new { TaskId = taskId });
+ }
+ catch (Exception ex)
+ {
+ return BadRequest(new { message = ex.Message, detail = ex.ToString() });
+ }
+ }
+
+ ///
+ /// Represents a task record returned to the client and stored in the `task_data` table.
+ ///
+ public class TaskData
+ {
+ [Key]
+ public int? TaskId { get; set; }
+ public string? TaskName { get; set; }
+ public DateTime? StartDate { get; set; }
+ public DateTime? EndDate { get; set; }
+ public int? ParentId { get; set; }
+ public int? Duration { get; set; }
+ public string Predecessor { get; set; }
+ public int? Progress { get; set; }
+ }
+
+ ///
+ /// Generic CRUD wrapper used by the UrlAdaptor and server endpoints for batch and single operations.
+ ///
+ /// The payload type (e.g., ).
+ public class CRUDModel where T : class
+ {
+ /// The action type (for example: "insert", "update", "remove", "batch").
+ [JsonPropertyName("action")]
+ public string? Action { get; set; }
+
+ /// The name of the key column used by the client.
+ [JsonPropertyName("keyColumn")]
+ public string? KeyColumn { get; set; }
+
+ /// The key value identifying a single record (for single operations).
+ [JsonPropertyName("key")]
+ public object? Key { get; set; }
+
+ /// The single entity payload for insert/update operations.
+ [JsonPropertyName("value")]
+ public T? Value { get; set; }
+
+ /// Collection of added records for batch operations.
+ [JsonPropertyName("added")]
+ public List? Added { get; set; }
+
+ /// Collection of changed records for batch operations.
+ [JsonPropertyName("changed")]
+ public List? Changed { get; set; }
+
+ /// Collection of deleted records for batch operations.
+ [JsonPropertyName("deleted")]
+ public List? Deleted { get; set; }
+
+ /// Additional parameters sent by the client.
+ [JsonPropertyName("params")]
+ public IDictionary? Params { get; set; }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Gantt/IntegrationWithNet10/Binding Dapper using Url Adaptor/Blazor Web App/Gantt_Dapper/GanttDapper/GanttDapper.csproj b/Gantt/IntegrationWithNet10/Binding Dapper using Url Adaptor/Blazor Web App/Gantt_Dapper/GanttDapper/GanttDapper.csproj
new file mode 100644
index 00000000..62b90f51
--- /dev/null
+++ b/Gantt/IntegrationWithNet10/Binding Dapper using Url Adaptor/Blazor Web App/Gantt_Dapper/GanttDapper/GanttDapper.csproj
@@ -0,0 +1,20 @@
+
+
+
+ net9.0
+ enable
+ enable
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Gantt/IntegrationWithNet10/Binding Dapper using Url Adaptor/Blazor Web App/Gantt_Dapper/GanttDapper/GanttDapper.csproj.user b/Gantt/IntegrationWithNet10/Binding Dapper using Url Adaptor/Blazor Web App/Gantt_Dapper/GanttDapper/GanttDapper.csproj.user
new file mode 100644
index 00000000..c404400a
--- /dev/null
+++ b/Gantt/IntegrationWithNet10/Binding Dapper using Url Adaptor/Blazor Web App/Gantt_Dapper/GanttDapper/GanttDapper.csproj.user
@@ -0,0 +1,9 @@
+
+
+
+ https
+
+
+ ProjectDebugger
+
+
\ No newline at end of file
diff --git a/Gantt/IntegrationWithNet10/Binding Dapper using Url Adaptor/Blazor Web App/Gantt_Dapper/GanttDapper/Program.cs b/Gantt/IntegrationWithNet10/Binding Dapper using Url Adaptor/Blazor Web App/Gantt_Dapper/GanttDapper/Program.cs
new file mode 100644
index 00000000..253d46ac
--- /dev/null
+++ b/Gantt/IntegrationWithNet10/Binding Dapper using Url Adaptor/Blazor Web App/Gantt_Dapper/GanttDapper/Program.cs
@@ -0,0 +1,44 @@
+using GanttDapper.Client.Pages;
+using GanttDapper.Components;
+using Syncfusion.Blazor;
+
+var builder = WebApplication.CreateBuilder(args);
+
+// Add services to the container.
+builder.Services.AddRazorComponents()
+ .AddInteractiveServerComponents()
+ .AddInteractiveWebAssemblyComponents();
+
+builder.Services.AddSyncfusionBlazor();
+builder.Services.AddControllers();
+
+builder.Services.AddServerSideBlazor()
+ .AddCircuitOptions(options => { options.DetailedErrors = true; });
+
+var app = builder.Build();
+
+// Configure the HTTP request pipeline.
+if (app.Environment.IsDevelopment())
+{
+ app.UseWebAssemblyDebugging();
+}
+else
+{
+ app.UseExceptionHandler("/Error", createScopeForErrors: true);
+ // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
+ app.UseHsts();
+}
+
+app.UseHttpsRedirection();
+
+
+app.UseAntiforgery();
+app.MapControllers();
+
+app.MapStaticAssets();
+app.MapRazorComponents()
+ .AddInteractiveServerRenderMode()
+ .AddInteractiveWebAssemblyRenderMode()
+ .AddAdditionalAssemblies(typeof(GanttDapper.Client._Imports).Assembly);
+
+app.Run();
diff --git a/Gantt/IntegrationWithNet10/Binding Dapper using Url Adaptor/Blazor Web App/Gantt_Dapper/GanttDapper/Properties/launchSettings.json b/Gantt/IntegrationWithNet10/Binding Dapper using Url Adaptor/Blazor Web App/Gantt_Dapper/GanttDapper/Properties/launchSettings.json
new file mode 100644
index 00000000..9510b85b
--- /dev/null
+++ b/Gantt/IntegrationWithNet10/Binding Dapper using Url Adaptor/Blazor Web App/Gantt_Dapper/GanttDapper/Properties/launchSettings.json
@@ -0,0 +1,40 @@
+{
+ "profiles": {
+ "http": {
+ "commandName": "Project",
+ "launchBrowser": true,
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ },
+ "dotnetRunMessages": true,
+ "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}",
+ "applicationUrl": "http://localhost:5298"
+ },
+ "https": {
+ "commandName": "Project",
+ "launchBrowser": true,
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ },
+ "dotnetRunMessages": true,
+ "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}",
+ "applicationUrl": "https://localhost:7237;http://localhost:5298"
+ },
+ "IIS Express": {
+ "commandName": "IISExpress",
+ "launchBrowser": true,
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ }
+ },
+ "$schema": "https://json.schemastore.org/launchsettings.json",
+ "iisSettings": {
+ "windowsAuthentication": false,
+ "anonymousAuthentication": true,
+ "iisExpress": {
+ "applicationUrl": "http://localhost:52188/",
+ "sslPort": 44309
+ }
+ }
+}
\ No newline at end of file
diff --git a/Gantt/IntegrationWithNet10/Binding Dapper using Url Adaptor/README.md b/Gantt/IntegrationWithNet10/Binding Dapper using Url Adaptor/README.md
new file mode 100644
index 00000000..674bd28e
--- /dev/null
+++ b/Gantt/IntegrationWithNet10/Binding Dapper using Url Adaptor/README.md
@@ -0,0 +1,131 @@
+# Blazor Gantt with MS SQL and Dapper
+
+## Project Overview
+
+This repository demonstrates a straightforward pattern for binding **MS SQL Server** database to **Syncfusion Blazor Gantt** using **[Dapper](https://www.nuget.org/packages/Dapper)** and the UrlAdaptor from SfDataManager. The sample provides full CRUD (Create, Read, Update, Delete) functionality, filtering, sorting, and hierarchical parent/child support.
+
+## Key Features
+
+- **MS SQL**: Reliable relational database for production environments and LocalDB support for development.
+- **Dapper**: Lightweight, high-performance micro‑ORM for parameterized SQL and fast data mapping.
+- **Syncfusion Blazor Gantt**: Built-in editing, inserting, deleting, filtering, sorting, and parent/child hierarchy (via ParentId).
+- **UrlAdaptor**: API communication for all CRUD actions.
+
+## Prerequisites
+
+| Component | Version | Purpose |
+|-----------|---------|---------|
+| Visual Studio 2026 | 18.1.0 or later | Development IDE with Blazor workload |
+| .NET SDK | net10.0 or compatible | Runtime and build tools |
+| [SQL Server Management Studio]| Latest | Core framework for database operations |
+| [Dapper] | 2.1.66 or latest | Lightweight data mapper |
+| [Microsoft.Data.SqlClient] | 6.1.4 or Latest | SQL Server client driver |
+| [Syncfusion.Blazor.Gantt] | 32.1.25 or Latest | Gantt and UI components |
+| [Syncfusion.Blazor.Themes] | 32.1.25 or Latest | Styling for Gantt components |
+
+## Quick Start
+
+1. **Clone the repository**
+ ```bash
+ git clone
+ cd "Binding Dapper using UrlAdaptor"
+ cd "Blazor Web app/GanttDapper"
+ ```
+
+2. **Create the database and table**
+
+ Open MS SQL and run:
+ ```sql
+ CREATE DATABASE ganttdb;
+ USE ganttdb;
+
+ CREATE TABLE task_data (
+ TaskId INT PRIMARY KEY,
+ TaskName VARCHAR(50) NOT NULL,
+ StartDate DATETIME NULL,
+ EndDate DATETIME NULL,
+ ParentId INT NULL,
+ Duration INT NOT NULL,
+ Predecessor VARCHAR(50) NULL,
+ Progress INT NOT NULL
+ );
+ ```
+
+3. **Update the connection string**
+
+ Replace connected database's connectionstring in GanttController.cs file in Controllers folder of Gantt_Dapper.
+
+4. **Restore packages and build**
+ ```bash
+ dotnet restore
+ dotnet build
+ ```
+
+5. **Run the application**
+ ```bash
+ dotnet run
+ ```
+
+6. **Open the application**
+
+ Navigate to the local URL displayed in the terminal (typically `https://localhost:xxxx`).
+
+
+## Project Layout
+
+| File/Folder | Purpose |
+|-------------|---------|
+| `Controllers/GanttController.cs` | API controller with Dapper queries for CRUD |
+| `/Components/Pages/Home.razor` | Gantt page with UrlAdaptor implementation |
+| `/Program.cs` | Service registration and Syncfusion configuration |
+
+
+## Common Tasks
+
+### Add a Task
+1. Click the **Add** button in the toolbar
+2. Fill in the Dialog fields
+3. Click **Save** to persist the record to the database
+
+### Edit a Task
+1. Select a task row in the gantt
+2. Click the **Edit** button in the toolbar
+3. Modify the required fields
+4. Click **Save** to save changes
+
+### Delete a Task
+1. Select a task row in the gantt
+2. Click the **Delete** button in the toolbar
+3. Confirm the deletion in the dialog
+
+### Search Records
+1. Use the **Search** box in the toolbar
+2. Enter keywords to filter records (searches across all columns)
+
+### Filter Records
+1. Click the filter icon in any column header
+2. Select filter criteria (equals, contains, greater than, etc.)
+3. Click **Filter** to apply
+
+### Sort Records
+1. Click the column header to sort ascending
+2. Click again to sort descending
+
+## Troubleshooting
+
+### Connection Error
+- Verify SQL Server is running and reachable.
+- Test connection in SSMS with same credentials.
+
+### Missing Tables
+- Verify the SQL script was executed successfully
+- Run the database creation script again
+
+### Static Files Not Loading
+- Verify Syncfusion stylesheet and script references are present in `App.razor`
+- Check browser developer tools for 404 errors on static resources
+
+### Version Conflicts
+- Align Entity Framework Core, Pomelo, and Syncfusion package versions
+- Run `dotnet restore` to update NuGet packages
+- Check the `.csproj` file for conflicting version constraints
diff --git a/Gantt/IntegrationWithNet10/Binding Mysql DB using Custom Adaptor/Blazor Web App/GanttMySQL/Components/App.razor b/Gantt/IntegrationWithNet10/Binding Mysql DB using Custom Adaptor/Blazor Web App/GanttMySQL/Components/App.razor
new file mode 100644
index 00000000..ae4ca78b
--- /dev/null
+++ b/Gantt/IntegrationWithNet10/Binding Mysql DB using Custom Adaptor/Blazor Web App/GanttMySQL/Components/App.razor
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Gantt/IntegrationWithNet10/Binding Mysql DB using Custom Adaptor/Blazor Web App/GanttMySQL/Components/Layout/MainLayout.razor b/Gantt/IntegrationWithNet10/Binding Mysql DB using Custom Adaptor/Blazor Web App/GanttMySQL/Components/Layout/MainLayout.razor
new file mode 100644
index 00000000..f8c3a56c
--- /dev/null
+++ b/Gantt/IntegrationWithNet10/Binding Mysql DB using Custom Adaptor/Blazor Web App/GanttMySQL/Components/Layout/MainLayout.razor
@@ -0,0 +1,11 @@
+@inherits LayoutComponentBase
+
+
+
+
+ @Body
+
+
+
+
+
diff --git a/Gantt/IntegrationWithNet10/Binding Mysql DB using Custom Adaptor/Blazor Web App/GanttMySQL/Components/Pages/Home.razor b/Gantt/IntegrationWithNet10/Binding Mysql DB using Custom Adaptor/Blazor Web App/GanttMySQL/Components/Pages/Home.razor
new file mode 100644
index 00000000..53c4454a
--- /dev/null
+++ b/Gantt/IntegrationWithNet10/Binding Mysql DB using Custom Adaptor/Blazor Web App/GanttMySQL/Components/Pages/Home.razor
@@ -0,0 +1,182 @@
+@page "/"
+@rendermode InteractiveServer
+
+@using System.Collections
+@using Syncfusion.Blazor.Data
+@using Syncfusion.Blazor.Gantt
+@using GanttMySql.Data
+
+@inject TaskRepository TaskService
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+@code {
+ private CustomAdaptor? _customAdaptor;
+
+ ///
+ /// Initializes the component and sets up the custom adaptor with the injected TaskService.
+ ///
+ protected override void OnInitialized()
+ {
+ _customAdaptor = new CustomAdaptor { TaskService = TaskService };
+ }
+
+ ///
+ /// Custom DataAdaptor to handle Gantt data operations with MySQL using EF Core.
+ /// Bridges Syncfusion DataManager requests to the repository.
+ ///
+ public class CustomAdaptor : DataAdaptor
+ {
+ private static TaskRepository? _taskService { get; set; }
+
+ ///
+ /// Task repository instance used to fulfill data operations.
+ ///
+ public TaskRepository? TaskService
+ {
+ get => _taskService;
+ set => _taskService = value;
+ }
+
+ ///
+ /// Reads data according to DataManagerRequest (search, sort, paging).
+ ///
+ /// The DataManagerRequest containing query, paging, sorting, and search criteria.
+ /// Optional key value for single-record reads.
+ ///
+ /// Returns either a (when counts are requested) or the IEnumerable of tasks as an object.
+ ///
+ public override async Task