Entity Framework를 사용해 JOIN 쿼리문을 수행하는 방법에 대해 알아봅니다.
0. 소스코드
소스코드는 다음 링크에서 확인할 수 있습니다: https://github.com/smoh-dev/EF_Join
1. DB 준비
MySQL을 설치 한 뒤 다음과 같은 쿼리문을 수행해 테이블을 생성합니다.
#Create user table
CREATE TABLE `dev_db`.`tbl_user` (
`key` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(64) NULL,
PRIMARY KEY (`key`));
#Create order table.
CREATE TABLE `dev_db`.`tbl_order` (
`key` INT NOT NULL AUTO_INCREMENT,
`user_key` INT NOT NULL,
`code` VARCHAR(128) NOT NULL,
PRIMARY KEY (`key`),
INDEX `fk_user_key_idx` (`user_key` ASC),
CONSTRAINT `fk_user_key`
FOREIGN KEY (`user_key`)
REFERENCES `dev_db`.`tbl_user` (`key`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
#Insert default data.
INSERT INTO `dev_db`.`tbl_user`(`name`) VALUES ('smoh');
INSERT INTO `dev_db`.`tbl_order`(`user_key`, `code`) VALUES (1, 'my-custom-order-id');
2. 프로젝트 생성.
편의를 위해 간단한 프로젝트를 생성합니다.
3. NuGet 패키지 설치.
다음 NuGet 패키지를 설치합니다.
4. Table Model 생성
앞서 생성한 테이블대로 모델을 생성합니다.
//TableUser
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace my_test_api.Model
{
[Table("tbl_user")]
public class TableUser
{
[Key]
[Column("key")]
public int Key { get; set; }
[Column("name")]
public string Name { get; set; }
}
}
//TableOrder
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace my_test_api.Model
{
[Table("tbl_order")]
public class TableOrder
{
[Key]
[Column("key")]
public int Key { get; set; }
[Column("user_key")]
public int UserKey { get; set; }
[Column("code")]
public string Code { get; set; }
}
}
5. DB Context 생성
이제 DB Context를 생성해 서비스에 연결합니다.
//DBContext
using Microsoft.EntityFrameworkCore;
using my_test_api.Model;
namespace my_test_api
{
public class DBContext : DbContext
{
protected override void OnConfiguring(DbContextOptionsBuilder options)
{
var connectionString = "server=localhost; database=dev_db; user=dev; password=devpass";
options.UseMySql(connectionString, ServerVersion.AutoDetect(connectionString));
}
public DbSet<TableUser> User { get; set; }
public DbSet<TableOrder> Order { get; set; }
}
}
//Program.cs
using my_test_api;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
//Add DBContext
builder.Services.AddSingleton<DBContext>();
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseAuthorization();
app.MapControllers();
app.Run();
6. 컨트롤러 작성
다음 코드와 같이 간단한 컨트롤러를 작성합니다.
//UserOrderController.cs
using Microsoft.AspNetCore.Mvc;
using my_test_api.Model;
namespace my_test_api.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class UserOrderController : ControllerBase
{
DBContext dbContext;
public UserOrderController(DBContext dBContext)
{
this.dbContext = dBContext;
}
// GET api/<UserOrderController>/1
[HttpGet("{id}")]
public string Get(int id)
{
var query = (from u in dbContext.Set<TableUser>()
join o in dbContext.Set<TableOrder>()
on u.Key equals o.UserKey
where u.Key == id
select new { u, o }).SingleOrDefault();
string result = $"UserKey: {query.u.Key}, UserName: {query.u.Name}, OrderKey: {query.u.Key}, OrderCode: {query.o.Code}";
return result;
}
}
}
내부의 query를 통해 DB Table Join 작업을 수행합니다.
7. 테스트
이제 Swagger를 열고 테스트를 진행해 봅시다.
쿼리가 정상적으로 동작해 데이터가 출력되는 것을 확인할 수 있습니다.
반응형
'Programming > C#' 카테고리의 다른 글
[C#] Entity Framework vs Dapper (0) | 2022.12.28 |
---|---|
[MongoDB] MongoDB Driver Upgrade 1.x ⇒ 2.x (0) | 2022.09.05 |
[C#] EntityFramework로 MySQL / MariaDB에 연결하기. (0) | 2022.07.21 |
[C#] 액세스 한정자: Access Modifiers (0) | 2022.05.03 |
Cannot load Counter Name data because an invalid index '' was read from the registry. (0) | 2022.05.02 |