| 12345678910111213141516171819202122232425262728293031323334353637383940 |
- using Application.Abstractions.Data;
- using Application.Abstractions.Messaging;
- using Microsoft.EntityFrameworkCore;
- namespace Application.Features.Api.Stocks.Watch.List;
- /// <summary>
- /// 회원 관심종목 목록 — StockWatch(회원) 최근 등록순으로 Stock 을 Code 조인, 종목명·시장·최근 종가/등락률(denorm) 반환.
- /// enum→문자열 변환은 EF 번역 불가라 조회 후 메모리에서 매핑(GetList 패턴).
- /// </summary>
- internal sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Response>
- {
- public async Task<Response> Handle(Query request, CancellationToken ct)
- {
- var raw = await db.StockWatch.AsNoTracking()
- .Where(w => w.MemberID == request.MemberID)
- .OrderByDescending(w => w.CreatedAt)
- .Join(db.Stock.AsNoTracking(), w => w.StockCode, s => s.Code, (w, s) => new
- {
- s.Code,
- s.Name,
- s.Market,
- s.LastClosePrice,
- s.LastChangeRate
- })
- .ToListAsync(ct);
- return new Response
- {
- List = [..raw.Select(c => new Response.Row
- {
- Code = c.Code,
- Name = c.Name,
- Market = c.Market.ToString(),
- ClosePrice = c.LastClosePrice,
- ChangeRate = c.LastChangeRate
- })]
- };
- }
- }
|