Я пытаюсь создать общий просмотрщик/редактор таблиц для приложения MVC 6.
В настоящее время я использую
Context.GetEntityTypes();
Чтобы вернуть мне список таблиц.
Теперь мне нужно получить данные для определенного типа. Моя текущая реализация:
// On my context
public IQueryable<dynamic> GetDbSetByType(string fullname)
{
Type targetType = Type.GetType(fullname);
var model = GetType()
.GetRuntimeProperties()
.Where(o =>
o.PropertyType.IsGenericType &&
o.PropertyType.GetGenericTypeDefinition() == typeof(DbSet<>) &&
o.PropertyType.GenericTypeArguments.Contains(targetType))
.FirstOrDefault();
if (null != model)
{
return (IQueryable<dynamic>)model.GetValue(this);
}
return null;
}
С помощью этого кода в контроллере
[HttpGet("{requestedContext}/{requestedTable}/data")]
public IActionResult GetTableData(string requestedContext, string requestedTable)
{
var data = Request.Query;
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 set = context.GetDbSetByType(entity.ClrType.AssemblyQualifiedName);
if (set == null)
{
return new ErrorObjectResult("Invalid table specified - DbSet could not be found");
}
var start = Convert.ToInt32(data["start"].ToString());
var count = Convert.ToInt32(data["length"].ToString());
var search = data["search[value]"];
return new ObjectResult(set.Skip(start).Take(count));
}
Как бы то ни было, это вернет данные длины count
и из позиции start
. Однако я не могу выполнять запросы по конкретным свойствам IQueryable<dynamic>
.
Проблема заключается в следующем:
- Это кажется тривиальной задачей, поэтому я почти уверен, что чего-то не хватает - это должно быть легко сделать.
- Если не 1, то как мне преобразовать мой
object set
обратно вDbSet<T>
, чтобы я мог выполнять свои запросы? Если я установил точку останова и проверил, я вижу, что все мои данные просто сидят там.
ПРИМЕЧАНИЕ: Это EF7
ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ:
-
requestedTable
- это полный тип EG:<mysystem>.Models.Shared.Users
EDIT (2016/5/5)
В итоге я просто делал все в простом SQL - если кто-то справится с этой работой, пожалуйста, дайте мне знать!