Creé una pequeña API agradable con ASP.NET Web API, pero supongo que no es correcto devolver las entidades de mi contexto (entidad marco) AsQueryable, así que estoy mapeando todo a los objetos DTO.ASP.NET Web API devuelve DTO cuestionables?
Lo que no entiendo del todo sin embargo: ¿cómo puedo mantener mi contexto consultable, pero aún así solo devuelvo DTO en lugar de entidades? O esto no es posible?
Este es mi código:
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();
}
}
Como se puede ver que cargar los datos, y hacer que poco consultable colección IEnumerable. El problema es que la consulta que se genera para este fragmento de código probablemente sea bastante ineficiente porque primero carga todos los elementos (o al menos los 20 primeros elementos) y luego filtra el resultado.
Espero haber descrito mi problema lo mejor posible, es un poco difícil de explicar. No pude encontrar nada al respecto en Google.
No exponer los puntos finales de la API web como IQueryable en absoluto ... Si realmente los necesita, vaya a Web API OData. De lo contrario, basta con quedarse con los viejos puntos finales REST y exponer cualquier tipo de filtrado posible como parámetros en las acciones de su controlador. – mare