C#
Request → Controller → Service → SQL → Map → Return
====================================================
*/
using Microsoft.AspNetCore.Mvc;
using MySql.Data.MySqlClient;
namespace InterviewHelp
{
// =========================
// DTO / MODEL
// =========================
public class StaffDto
{
public int Id { get; set; }
public string Name { get; set; } = "";
public string? Phone { get; set; }
}
// =========================
// CONTROLLER (ENTRY POINT)
// =========================
[ApiController]
[Route("api/[controller]")]
public class StaffController : ControllerBase
{
private readonly StaffService _service;
public StaffController(StaffService service)
{
_service = service;
}
[HttpGet("search")]
public async Task<IActionResult> Search(string input)
{
// VALIDATE INPUT
if (string.IsNullOrWhiteSpace(input))
return BadRequest("Invalid input");
// CALL SERVICE
var result = await _service.SearchAsync(input);
// RETURN RESULT
return Ok(result);
}
}
// =========================
// SERVICE (BUSINESS LOGIC)
// =========================
public class StaffService
{
private readonly string _connectionString = "your_connection_string_here";
public async Task<List<StaffDto>> SearchAsync(string input)
{
var results = new List<StaffDto>();
/*
SQL PATTERN:
SELECT ...
FROM A
INNER JOIN B ON ...
LEFT JOIN C ON ...
WHERE ...
*/
var sql = @"
SELECT
s.ID,
s.Name,
p.Phone
FROM staff s
INNER JOIN phones p ON s.ID = p.StaffID
WHERE
s.Name LIKE @name
";
// =========================
// DATABASE EXECUTION
// =========================
await using var conn = new MySqlConnection(_connectionString);
await conn.OpenAsync();
await using var cmd = new MySqlCommand(sql, conn);
// PARAMETERIZED QUERY (SECURITY)
cmd.Parameters.AddWithValue("@name", "%" + input + "%");
await using var reader = await cmd.ExecuteReaderAsync();
// MAP RESULTS
while (await reader.ReadAsync())
{
var item = new StaffDto
{
Id = reader.GetInt32("ID"),
Name = reader.GetString("Name"),
// NULL HANDLING
Phone = reader.IsDBNull(reader.GetOrdinal("Phone"))
? null
: reader.GetString("Phone")
};
results.Add(item);
}
return results;
}
// =========================
// UPDATE EXAMPLE
// =========================
public async Task<bool> UpdatePhoneAsync(int id, string newPhone)
{
var sql = @"
UPDATE phones
SET Phone = @phone
WHERE StaffID = @id
";
await using var conn = new MySqlConnection(_connectionString);
await conn.OpenAsync();
await using var cmd = new MySqlCommand(sql, conn);
cmd.Parameters.AddWithValue("@phone", newPhone);
cmd.Parameters.AddWithValue("@id", id);
var rows = await cmd.ExecuteNonQueryAsync();
return rows > 0;
}
}
// =========================
// LINQ EXAMPLE
// =========================
public class Job
{
public string Status { get; set; } = "";
public int Quantity { get; set; }
public int CurrentInventory { get; set; }
public string PartName { get; set; } = "";
}
public class JobLogic
{
public List<Job> GetLowInventoryJobs(List<Job> jobs)
{
return jobs
.Where(j => j.Status == "Active" && j.CurrentInventory < j.Quantity)
.OrderBy(j => j.PartName)
.ToList();
}
}
}