我正在尝试为 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>
这样我就可以执行我的查询了?如果我设置断点并进行检查,我就可以看到所有数据就在那里。
NOTE:这是 EF7
附加信息:
- The
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));
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)