| 123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- using Application.Abstractions.Data;
- using Application.Abstractions.Messaging;
- using Microsoft.EntityFrameworkCore;
- namespace Application.Features.Api.Stocks.Suggest;
- /// <summary>종목 자동완성 — 이름/코드 prefix 매칭 상위 10건 (d0 §3-D, D1 소유)</summary>
- internal sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Response>
- {
- private const int MaxItems = 10;
- public async Task<Response> Handle(Query request, CancellationToken ct)
- {
- var q = request.Q?.Trim();
- if (string.IsNullOrEmpty(q))
- {
- return new Response
- {
- List = []
- };
- }
- var list = await db.Stock.AsNoTracking()
- .Where(c => c.IsActive && (c.Name.StartsWith(q) || c.Code.StartsWith(q)))
- .OrderBy(c => c.Name).ThenBy(c => c.Code)
- .Take(MaxItems)
- .Select(c => new
- {
- c.Code,
- c.Name,
- c.Market
- })
- .ToListAsync(ct);
- return new Response
- {
- List = [..list.Select(c => new Response.Item
- {
- Code = c.Code,
- Name = c.Name,
- Market = c.Market.ToString()
- })]
- };
- }
- }
|