Pregunta

Estoy intentando crear un visor / editor de tablas genérico para una aplicación MVC 6.

Actualmente uso

Context.GetEntityTypes();

Para devolverme una lista de tablas.

Ahora necesito recuperar los datos para un tipo específico. Mi implementación actual es:

Context.GetEntityTypes();

Con este código en mi controlador.

Context.GetEntityTypes();

Tal como está, esto devolverá los datos del count de longitud y desde el start posición. Sin embargo, no puedo realizar consultas sobre las propiedades específicas de IQueryable<dynamic> .

El problema es:

  1. Esto parece algo trivial, por lo que estoy casi seguro de que me estoy perdiendo algo, esto debe ser fácil de hacer.
  2. Si no es 1, ¿cómo convertiré mi object set a un DbSet<T> para poder realizar mis consultas? Si configuro un punto de interrupción e inspecciono, puedo ver todos mis datos simplemente sentados allí.

NOTA: Esto es EF7

INFORMACIÓN ADICIONAL:

  1. La clase requestedTable es el tipo totalmente calificado EG: <mysystem>.Models.Shared.Users

EDITAR (2016/5/5)

Terminé haciéndolo todo en SQL simple: si alguien logra que esto funcione, ¡dímelo!

Respuesta popular

Esto sería más simple usando un método genérico y usando DbContext.Set<TEntity>() . Puedes crear un método genérico en tiempo de ejecución como este:

public IActionResult GetTableData(string requestedContext, string requestedTable)
{
    var context = GetContext(requestedContext);

    if (context == null)
    {
        return new ErrorObjectResult("Invalid context specified");
    }
    var entity = context.GetEntity(requestedTable);

    if (entity == null)
    {
        return new ErrorObjectResult("Invalid table specified");
    }

    var boundMethod = s_getTableDataMethodInfo.MakeGenericMethod(entity.ClrType);
    return boundMethod.Invoke(this, new object[] { context }) as IActionResult;
}

private static readonly MethodInfo s_getTableDataMethodInfo
    = typeof(MyController).GetTypeInfo().GetDeclaredMethod("GetTableDataForEntity");

private IActionResult GetTableDataForEntity<TEntity>(DbContext context)
    where TEntity : class
{
    var data = Request.Query;
    var start = Convert.ToInt32(data["start"].ToString());
    var count = Convert.ToInt32(data["length"].ToString());
    var search = data["search[value]"];

    return new ObjectResult(context.Set<TEntity>().Skip(start).Take(count));
}



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué