我正在嘗試為MVC 6應用程序創建通用表查看器/編輯器。

我目前正在使用

Context.GetEntityTypes();

給我一個表格列表。

現在我需要獲取特定類型的數據。我目前的實施是:

Context.GetEntityTypes();

在我的控制器中使用此代碼

Context.GetEntityTypes();

實際上,這將返回長度count和位置start 。但是,我無法對IQueryable<dynamic>的特定屬性執行查詢。

問題是:

  1. 這似乎是一件微不足道的事情,所以我幾乎可以肯定我錯過了一些東西 - 這一定很容易做到。
  2. 如果不是1,那麼我如何將我的object set轉換回DbSet<T>以便我可以執行查詢?如果我設置斷點並檢查我可以看到我的所有數據都坐在那裡。

注意:這是EF7

附加信息:

  1. requestedTable是完全限定類型EG: <mysystem>.Models.Shared.Users

編輯(2016/5/5)

我最後只是用簡單的SQL來做這件事 - 如果有人設法讓這個工作,請告訴我!

熱門答案

通過使用泛型方法並使用DbContext.Set<TEntity>()這將更簡單。您可以在運行時創建泛型方法,如下所示:

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));
}



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因