Ho creato una piccola API con l'API Web ASP.NET, ma suppongo che non sia giusto restituire le entità dal mio contesto (framework di entità) AsQueryable, quindi sto mappando tutto sugli oggetti DTO.L'API Web ASP.NET restituisce DTO interrogabili?
Ciò che non capisco comunque: come posso mantenere il mio contesto interrogabile, ma restituisco solo DTO invece di entità? O questo non è possibile?
Questo è il mio codice:
public IQueryable<ItemDto> Get()
{
using (EfContext context = new EfContext())
{
Mapper.CreateMap<Item, ItemDto>()
.ForMember(itemDto => itemDto.Category, mce => mce.MapFrom(item => item.Category.Name));
IEnumerable<ItemDto> data = Mapper.Map<IEnumerable<Item>, IEnumerable<ItemDto>>(context.Items
.OrderByDescending(x => x.PubDate)
.Take(20));
return data.AsQueryable();
}
}
Come potete vedere ho caricare i dati, e fare quel piccolo raccolta queryable IEnumerable. Il problema è che la query generata per questo pezzo di codice è probabilmente abbastanza inefficiente perché carica tutti gli elementi prima (o almeno i primi 20 elementi) e quindi filtra l'output.
Spero di aver descritto il mio problema nel miglior modo possibile, è un po 'difficile da spiegare. Non ho trovato nulla su di esso su Google.
Non esporre gli endpoint dell'API Web come IQueryable a tutti ... Se proprio ciò è necessario, utilizzare OData Web API. Altrimenti, limitati a semplici vecchi endpoint REST e esponi qualsiasi tipo di filtro possibile come parametri sulle azioni del controller. – mare